Codeforces Round #503 (by SIS, Div. 2) C. Elections

【题目描述】

    Elections are coming. You know the number of voters and the number of parties — n and m respectively. For each voter you know the party he is going to vote for. However, he can easily change his vote given a certain amount of money. In particular, if you give i-th voter ci bytecoins you can ask him to vote for any other party you choose.

    The United Party of Berland has decided to perform a statistical study — you need to calculate the minimum number of bytecoins the Party needs to spend to ensure its victory. In order for a party to win the elections, it needs to receive strictly more votes than any other party.、

【题目链接】

    http://codeforces.com/contest/1020/problem/C

【算法】

    枚举答案,贪心选取投票者。

【代码】

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define pb push_back
 4 using namespace std;
 5 int n,m,tot;
 6 ll ans=LLONG_MAX;
 7 vector<int> party[3010];
 8 int rec[3010];
 9 int main()
10 {
11     scanf("%d%d",&n,&m);
12     for(int i=1;i<=n;i++) {
13         int p,c; scanf("%d%d",&p,&c);
14         party[p].pb(c);
15     }
16     for(int i=1;i<=m;i++) sort(party[i].begin(),party[i].end());
17     for(int i=max(1,(int)party[1].size());i<=n;i++) {
18         int cur=party[1].size(); ll cost=0;
19         tot=0;
20         for(int j=2;j<=m;j++) {
21             int k;
22             for(k=party[j].size();k>=i;k--) cost+=party[j][party[j].size()-k],cur++;
23             for(k=party[j].size()-k;k<party[j].size();k++) rec[++tot]=party[j][k];
24         }
25         if(cur<i) {
26             sort(rec+1,rec+tot+1);
27             for(int k=1;k<=tot&&cur<i;k++) cost+=rec[k],cur++;
28         }
29         ans=min(ans,cost);
30     }
31     printf("%I64d\n",ans);
32     return 0;
33 }

猜你喜欢

转载自www.cnblogs.com/Willendless/p/9462356.html