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;
}
View Code

 

posted @ 2018-08-14 14:24  shuai_hui  阅读(162)  评论(0编辑  收藏  举报