#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
n(投票人数),m(候选人数)
a(候选人m),b(被贿赂需要糖果数)
*/
bool vector_greater(const vector<long> & v1, const vector<long> & v2) {
return v1.size() > v2.size();
}
int main(int argc, char**argv) {
int n, m;
cin>>n>>m;
vector< vector<long> > v(m + 1);
for (int i = 0; i < n; i++) {
int a, b;
cin>>a>>b;
v[a].push_back(b);
}
int v1 = v[1].size();
//#选1的人数
if (m < 2) {//#小于两个候选人则不用贿赂
cout<<0<<endl;
return 0;
}
/*#
v[2]/vector(选2的) : 10 5 10
v[3]/vector(选3的)
v[4]/vector
.
.
.
*/
// 按糖果排序
for (int i = 2; i <= m; i++) {
sort(v[i].begin(), v[i].end(), greater<long>());
}
/*#
v[2]/vector(选2的) : 5 10 10
v[3]/vector(选3的)
v[4]/vector
.
.
.
*/
// 按候选人个数排序
vector< vector<long> >::iterator it = v.begin();
++it;
++it;
sort(it, v.end(), vector_greater);
//#自定义比较第一维元素的大小,即候选人m的投票人个数
long long total = 0;
while(v1 <= v[2].size()) {
int weizhi = 2;
long t2 = v[2].back();//#选取第二名候选人的最小糖果数进行贿赂;
for (int i = 3; i <= m; i++) {//#还是选取最小糖果数的投票人进行贿赂
if (v[i].size() > 0) {
long ti = v[i].back();
if (ti < t2) {
weizhi = i;
t2 = ti;
}
}
}
total += t2;
v[weizhi].pop_back();
v1++;
sort(it, v.end(), vector_greater);
}
/*
其实,可以判断第二位序候选人是否是一个人,是:
如果第二候选人的最小投票人糖果数不大于,剩余两个最小糖果数的和,则贿赂第二候选人的最小糖果数
否则: 直接贿赂最小的糖果数
*/
cout<<total<<endl;
return 0;
}
贿赂糖果,使得第一名候选人支持人最多
猜你喜欢
转载自blog.csdn.net/xiziyunqi/article/details/82622956
今日推荐
周排行