m個政黨,n個人投票,可以用錢收買投票者(話說,題出得這麼現實真的大丈夫?),求使得政黨1獲勝的最少費用
如果某個政黨i票數太多,1政黨可以通過買除i之外的政黨的票,最終比i票多獲勝,也可以買原本投給i的票,一方面增加1的票數,另一方面減少i的票數
計算1政黨如果最終有k張票,為了獲勝,其他政黨的票數必須比k小,則某個政黨i至少要賣掉vn[i]-k張票,如果至少其他政黨要賣的票數多於1政黨為了得到k張票要買的票數,那麼說明如果1政黨最終只有k張票是不可能獲勝的,否則就買下其他政黨至少要賣的票(挑最便宜的買,先排好序),買完這些票之後就保證了其他政黨的票都少於k,接下來只要挑便宜的票買夠k張
列舉1政黨最終有k(vn[1]~m)張票能獲勝所需金額,輸出最小值
#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
typedef long long ll;
const double eps=0.0000000000001;
const ll mod=4294967296;
const ll m=1000000000;
int n,m;
struct v;
vectorv;//記錄投票者編號和金額,用於排序
vectorp[3005];//p[i]:記錄投給i政黨的投票者編號和金額
int vn[3005];//vn[i]:投給政黨i的票數
bool f[3005];//f[i]:值為1表示i投票者已經被收買了
bool cmp(v x,v y)
else break;
} }if(t.size()>k-vn[1])
sort(t.begin(),t.end(),cmp);
int pos=0;
int ki=vn[1];
while(ki=k)break;
if(f[v[j].i]==0)
}//買完其他政黨至少需要賣的票,再從金額少且沒被買的票裡買
return res;
}int main()
vn[a]++;
} sort(v.begin(),v.end(),cmp);//所有金額從小到大排序
for(int i=2;i<=m;i++)
ll ans=inf;
for(int i=vn[1];i<=n;i++)
printf("%i64d\n",ans);
return 0;
}
CodeChef補題計畫
已完成2題。1.chsgmnts 題意 n 1000,a i 1e9,計數有多少對區間 l1,r1 l2,r2 滿足沒有乙個數x同時存在於 l1,r1 l2,r2 o n n 把相同的數建立鍊錶,且前驅pre i 對第乙個區間 for l1 1 n for r1 n 1 遍歷,對於pre r1 l1...
寒假補題 DP
problem description 世界盃結束了,義大利人連本帶利的收回了法國人6年前欠他們的債,捧起了大力神盃,成就了4星義大利.世界盃雖然結束了,但是這界世界盃給我們還是留下許多值得回憶的東西.比如我們聽到了黃名嘴的3分鐘激情解說,我們懂得了原來可以向同乙個人出示3張黃牌,我們還看到了齊達內...
線段樹補題
最近打了幾場,比賽有幾個題都可以用線段樹解,雖然還有其他o n 的解法比線段樹的o nlogn 更優,量也更少,但需要巧妙的構思或者其他技巧,可是我不會,我也想不出來。但是如果用線段樹有些題裡面的o n 的操作,直接變成o logn 就行了。include typedef long long ll ...