1020C Elections

Posted yzxverygood

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1020C Elections相关的知识,希望对你有一定的参考价值。

传送门

题目大意

现在有 n个人,m个党派,第i个人开始想把票投给党派pi,而如果想让他改变他的想法需要花费ci元。你现在是党派1,问你最少花多少钱使得你的党派得票数大于其它任意党派。

分析

我们枚举i,表示除了自己之外的其它任何党派最多得票数不超过i,而我们每次只需要改变一个党派中需要花费的钱最少的那几个人就行了,在保证其它党派德比得票数都小于i之后如果自己党派的得票小于i,则不断改变需花费钱最少的那一个人的想法就行了。详见代码。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define li long long
const li inf = 1e18;
struct node {
      int a;
      li b;
};
node d[5000];
inline bool cmp(const node x,const node y){
      return x.b<y.b;
}
int used[5000],tot[5000];
int main(){
      int n,m,i,j,k;
      scanf("%d%d",&n,&m);
      for(i=1;i<=n;i++){
        scanf("%d%lld",&d[i].a,&d[i].b);
      }
      sort(d+1,d+n+1,cmp);
      li ans=inf;
      for(i=1;i<=n;i++){
          memset(used,0,sizeof(used));
          memset(tot,0,sizeof(tot));
          li sum=0;
          for(j=n;j>0;j--)
            if(d[j].a!=1){
                if(tot[d[j].a]+1>=i){
                  tot[1]++;
                  used[j]=1;
                  sum+=d[j].b;
                }else {
                  tot[d[j].a]++;
                }
            }else {
              tot[1]++;
            used[j]=1;    
            }
          for(j=1;j<=n;j++)
            if(!used[j]&&tot[1]<i){
                tot[1]++;
                sum+=d[j].b;
            }
          if(tot[1]>=i)ans=min(ans,sum);
      }
      cout<<ans<<endl;
      return 0;
}

以上是关于1020C Elections的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 458C - Elections

CodeForces 458C Elections

UVA 11748 - Rigging Elections(dfs)

CodeForces - 1593A Elections

CodeForces - 1593A Elections

[Codeforces]850E - Random Elections