很久很久以前,在萊茵河畔一座岸壁陡峭的山頂上,有乙個名叫「杜斯特瓦德」的小村莊。不久前,這個小村莊每晚都會受到狼人的侵襲。每個夜晚,狼人都會在村中進行搶劫,並且會有乙個村民成為這群狼人的犧牲品。然而村民們不會坐以待斃,他們試圖在白天找到這些狼人並處決他們。
作為杜斯特瓦德村的長老,你需要組織村民來對抗狼人,村民包括許多有超能力的人,比如預言家可以檢驗乙個人是否是隱藏在神**營的狼人、獵人可以開槍打死一名狼人。因為狼人白天隱藏的非常深,僅僅單人的行動往往不能限制狼人的行動,多人行動將會起到更好的效果。比如預言家和獵人一起行動將被檢驗出是狼人的「村民」直接打死,村莊將回歸和平。
我們將這樣的一對人所產生的戰鬥力記作 ww,值得注意的是,乙個人可以被多次計算,比如預言家可以先後和獵人、女巫(或其他人)組合,即如果預言家和獵人的戰鬥力為 ww,預言家和女巫的戰鬥力為 w』w
′ ,這三個人的戰鬥力之和為 w+w』w+w
′ 。
不過因為經過「新月」事件,村莊貧苦破敗,你需要支付一定的金額給各個被你聘用的村民,假設你邀請了k個村民,則需要 k(2n-k)k(2n−k) 塊錢(nn 為村民總數),你的資金也不太足夠,所以你希望資金的利用率最大,資金的利用率定義為:((被選擇的人戰鬥力之和 // 你支付的資金))。除此之外有些人基於他們的重要性,是必須被選擇的。你必須邀請他們來參加戰鬥(保證至少一人)。
輸入格式
第一行包括兩個整數 n,mn,m 分別表示 nn 個村民和有 mm 對人之間有戰鬥力。
接下來 mm 行,每行有三個整數 u_i,v_i,w_iu
i ,v
i ,w
i (1 \le u_i,v_i \le n,(1≤u
i ,v
i ≤n, 1 \le w_i \le 100,1≤w
i ≤100, u_i \neq v_i)u
i ≠v
i ) 表示 這對人可以產生的戰鬥力 w_iw
i 。
接下來 nn 個數,對於第 ii 個數,00 表示第 ii 個人可參加戰鬥,11 表示第 ii 個人必須參加戰鬥(保證至少乙個 11)。
對於簡單版本,1 \leq n \leq 20,1≤n≤20, 0 \le m \le n(n-1)/20≤m≤n(n−1)/2;
對於中等版本,1 \leq n \leq 300,1≤n≤300, 0 \le m \le \min(1000, n(n-1)/2)0≤m≤min(1000,n(n−1)/2);
對於困難版本,1 \leq n \leq 400,1≤n≤400, 0 \le m \le \min(10000, n(n-1)/2)0≤m≤min(10000,n(n−1)/2)。
輸出格式
對於簡單版本和中等版本,輸出乙個 44 位小數,表示資金利用率的最大值,結果四捨五入;
對於困難版本,輸出乙個 66 位小數,表示資金利用率的最大值,結果四捨五入。
#include
using
namespace
std;
int nec[30];
int com[30][30];
int n,m;
int cal(int st)
int main()
for(int i=0;icin>>nec[i];
}int end=(1
for(int st=0;stint flag=0;
for(int i=0;iif(nec[i]==1)}}
if(flag) continue;
int t=cal(st);
double rr=0;
for(int i=0;iif(st&(1
<1.0/(t*(2*n-t));
res=max(rr,res);
}printf("%.4f\n",res );
}
計蒜客題庫加一(簡單)
1,並輸出加一以後的結果。例如 a 2,3,1,1,4 a 2,3 1,1 4 則結果為 2,3,1,1,5 2 3,1 1,5 a 7,8,9 a 7,8 9 則結果為 7,9,0 7 9,0 第一行輸入乙個正整數 n 1 leq n leq 100 n 1 n 100 接下來的一行,輸入用空格分...
計蒜客 灌溉機械人(狀壓DP)
灌溉機械人 include include using namespace std const int max n 100 const int max m 10 int state max n 1 i行狀態 int dp max n 1 1 max m 1 max m i行狀態為j i 1行狀態為k...
計蒜客 封印之門 簡單Floyd應用
蒜頭君被暗黑軍團包圍在一座島上,所有通往近衛軍團的路都有暗黑軍團把手。幸運的是,小島上有一扇上古之神打造的封印之門,可以通往近衛軍團,傳聞至今沒有人能解除封印。封印之門上有一串文字,只包含小寫字母,有 kkk 種操作規則,每個規則可以把乙個字元變換成另外乙個字元。經過任意多次操作以後,最後如果能把封...