洛谷小 c 正在玩一款排兵布陣的遊戲。在遊戲中有 \(n\) 座城堡,每局對戰由兩名玩家來爭奪這些城堡。每名玩家有 \(m\) 名士兵,可以向第 \(i\) 座城堡派遣 \(a_i\) 名士兵去爭奪這個城堡,使得總士兵數不超過 \(m\)。
如果一名玩家向第 \(i\) 座城堡派遣的士兵數嚴格大於對手派遣士兵數的兩倍,那麼這名玩家就占領了這座城堡,獲得 \(i\) 分。
現在小 c 即將和其他 \(s\) 名玩家兩兩對戰,這 \(s\) 場對決的派遣士兵方案必須相同。小 c 通過某些途徑得知了其他 \(s\) 名玩家即將使用的策略,他想知道他應該使用什麼策略來最大化自己的總分。
由於答案可能不唯一,你只需要輸出小 c 總分的最大值
我們先從部分分入手:
當\(s==1\)的時候
我們可以把他當成乙個\(01\)揹包,揹包總體積為m,每個城堡為每一件物品,他的價值為 \(i\) 及他的編號,他的體積為 \(2*\) 派兵的人數加一(保證嚴格大於其他玩家派兵的人數)。這樣跑一遍\(01\)揹包不就完事了嗎 qaq。。。。
這樣你就會拿到 40-50pts。
附上 40-50pts **
#include#include#includeusing namespace std;
int n,m,s,v;
int f[20010],c[110][110],w[110][110];
void slove2()
} for(int i = 1; i <= n; i++)//01揹包 }
if(s == 1) printf("%d\n",f[m]);
}int main()
考慮這樣乙個優化:
當我們往乙個城堡派兵數量為 \(v\)時,那麼小於\(v\)的其他人都會被打敗,也就是出兵比我們少的,都會的打敗。假設出兵比我們少的人為 \(p\) 那麼你就可以獲得 \(i\) * \(p\) 的分數。\(i\)為城堡編號。
我們可以通過排序加快這一過程,這樣我們得到了每件物品的價值和體積。
但這時不再是個\(01\)揹包,而是個分組揹包。我們可以把每個城堡當做一組,
每個城堡,你可以放s種選擇,來打敗玩家,但每種選擇只能選一種。
然後這就是個裸的分組揹包了。
綜上,這個題的大體思路就是,通過派兵人數從大到小排序處理出每件物品的價值和體積。 物品的體積就是\(2*\)派兵人數+\(1\) 價值就是 \(i*\) 比他小的數的個數(因為排序保證前邊的出兵人數都是比他小的)。最後跑一遍分組揹包,就可以輕鬆ac了這道題。
附上ac**
#include#include#includeusing namespace std;
int n,m,s,v;
int f[20010],c[110][110],w[110][110];
int main()
} for(int i = 1; i <= n; i++)
} for(int i = 1; i <= n; i++)//分組揹包的模板
}} }
printf("%d\n",f[m]);
return 0;
}
a排兵布陣
c國的死對頭a國這段時間正在進行軍事演習,所以c國間諜頭子derek和他手下tidy又開始忙乎了。a國在海岸線沿直線布置了n個工兵營地,derek和tidy的任務就是要監視這些工兵營地的活動情況。由於採取了某種先進的監測手段,所以每個工兵營地的人數c國都掌握的一清二楚,每個工兵營地的人數都有可能發生...
FROM LUOGU 排兵布陣
傳送門 sol 乍一看你可能jio得這是乙個貪心 模擬 如果是這樣的話,顯然你想多了 我們發現這應該是乙個dp,再看看題目,存在兵力上限,那就相當於揹包容積咯,那就是分組揹包咯 可是也沒這麼輕易就讓你a了,直接轉移是不行的,我們可以貪心發現你打第i ii個碉堡時如果想打爆最弱的j jj個玩家,用2 ...
Wi Fi建設,如何「排兵布陣」?
二戰中知名的 馬奇諾防線 雖然投資巨大,但依靠預判以靜制動,機動性較差,面對變化時很難具有抵抗力,短短1個月內就被德軍採用動態的迂迴戰術突破了。換個角度來看,如果強大的力量和資源被固化了,當現實和預判不一致,只能眼睜睜地看著威脅從自己的薄弱處突破,可見,機動性和資源隨需而動是多麼的重要!與此類似,大...