Codeforces Round #503 (by SIS, Div. 2) C. Elections
题意:有n个学生,m个政党,每个学生有支持的政党,但是如果你给他一些钱,他就可以给你想让他投的党投票,现在想付出最少的钱使得1政党有绝对优势(票数严格大于其他党)。
分析:运用一种枚举贪心的思想,枚举胜利的必要条件,就是枚举改变了I个人,就可以达到胜利
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct sss { int id; int cost; }a[3001]; int f[3001]; int g[3001]; int cmp(struct sss x,struct sss y) { return x.cost<y.cost; } int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d%d",&a[i].id,&a[i].cost); f[a[i].id]++;//计入最开始的投票情况 } long long sum=999999999999,sum2=0,ans; sort(a+1,a+n+1,cmp);//按价格排好序 for(int i=f[1];i<=n;i++)//枚举获胜状态 { sum2=0; ans=0; for(int j=2;j<=m;j++) { if(f[j]>=i) { g[j]=f[j]-i+1;//记录要赢得此选手要在他这买几票 sum2+=g[j];//记录总共要在比他高的选手这买几票 } else g[j]=0; } if(i-f[1]<sum2) continue;//如果我在比他高的选手这买的票比我总共买的还多说明情况不存在 sum2=i-f[1]-sum2;//记录要在比我低的选手这买几票 for(int j=1;j<=n;j++) { if(g[a[j].id]!=0)//比我高 { g[a[j].id]--; ans+=a[j].cost; } else{ if(sum2!=0&&a[j].id!=1)//比我低,并且我还需要买票 { sum2--; ans+=a[j].cost; } } } sum=min(sum,ans);//取最优 } cout<<sum; }