贿赂糖果,使得第一名候选人支持人最多

#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