洛谷 U140956 新漂亮国大选
题目背景
漂亮国是一个“团结”,“民主”的国家。
题目描述
现在,漂亮国马上要迎来2020年大选,大选要选出一个党派作为国家的执政党。因为漂亮国很“民主”,所以漂亮国有MM个政党:共和党、民主党、社会党、绿党、红党......现在,你被聘请为漂亮国红党选举总顾问,你事先知道了参与大选的选民的数量为NN ,并且,对于每一位选民,你知道他将要选举哪一个政党。你担忧地发现,如果正常选举,你的党派并不会赢。不过,你又发现:每一位选民都会在接受一定数额的漂亮金之后改变他的主意。如果你给第ii位选民c_ic**i数额的漂亮金,他就会选举你希望他选举的红党。
那么,如果红党要赢得这场选举,红党就必须拥有比其它政党都多的选票。你向红党中央递交了你的计划:显然,这需要大量的资金。红党对选举势在必得,但是,他们希望花费的漂亮金尽可能少。
请你再算一下:最少需要多少漂亮金,才能保证红党赢得胜利。
输入格式
从文件election.inelectio**n.i**n中读入数据。
第一行包含两个整数NN和MM。表示选民数量和政党数量。
接下来NN行,每一行两个整数p_ip**i和c_ic**i,表示这一位选民将会选举政党的编号,和使他改变主意的最少漂亮金数额。
特别地,红党的编号是11。
输出格式
输出到文件election.outelectio**n.out中。
一个整数ansans,表示使红党赢得选举所需花费的最少漂亮金数额。
命题背景:
Biden WINS!
一直想出一个美国大选之类的背景。
之前尝试了一道,也就是漂亮国大选1.
但是没有SPJ就太水,有SPJ我不会。
所以正好看到了这道,那就改成这个吧。
题解:
贪心+二分。
代码:
#include<cstdio>
#include<vector>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=1e5+5;
int n,m;
vector<int> v[maxn];
ll check(int x)//买x张选票能否更优
{
ll ret=0;
int tot=0;
vector<int> tmp;
for(int i=1;i<maxn;++i)
{
int j=0,k=v[i].size();
while(k>=x)
ret+=v[i][j++],--k,++tot;
while(j<v[i].size())
tmp.push_back(v[i][j++]);
}
sort(tmp.begin(),tmp.end());
for(int i=0;i<tmp.size();++i)
{
if(tot>=x)
break;
ret+=tmp[i],++tot;
}
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int p,c;
scanf("%d%d",&p,&c);
v[p].push_back(c);
}
for(int i=1;i<maxn;i++)
sort(v[i].begin(),v[i].end());
for(int i=0;i<v[1].size();i++)
v[1][i]=0;
int l=1,r=n;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(mid)<check(mid+1))
r=mid-1;
else
l=mid+1;
}
printf("%lld
",check(l));
return 0;
}