補題向 Elections(列舉)

2021-08-24 18:22:33 字數 1489 閱讀 6331

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 ...