E2. Voting (Hard Version)(思维)

E2. Voting (Hard Version)(思维)_第1张图片 E2. Voting (Hard Version)(思维)_第2张图片

 

有 n 个人,每个人有 mi 和 pi ,mi 代表着如果有 mi 个人投票给他,那么他就免费投票给他,否则你需要花费pi的代价来收买他。请问最少花费多少使得所有人都投他。

看到 m 数组的数据范围,m 数组作为数组下标应该是没得跑了,有贪心策略我们应该选择 pi 尽量少的那些人,但是同时要照顾到 m 数组。

因为要贿赂的总人数我们不知道,但借用优先队列(小根堆),将目前为止的最少需要的贿赂人数贿赂。

向题目中提到的:m :1 2 2 4 5,只需贿赂 m[5] 即可,这样贪心策略就出来了:把这些 m 偏大的人先贿赂了,贿赂的最少人数为 n-i (i 为 m 数组的下标)  

    vector v[N];

int main()
{
    //IOS;
    rush(){
        sd(n);
        for(i=0;i<=n;i++) v[i].clear();
        for(int i=1,p;i<=n;i++){
            sdd(m,p);
            v[m].pb(p);
        }

        priority_queue< int ,vector,greater >q;

        ll ans=0;
        for(i=n;i>=0;i--){
            int len=v[i].size();
            for(j=0;jn-i){//到此时为止必须有 n-i 个人为其投票 
                ans+=q.top();
                q.pop();
            }
        }
        pll(ans);
    }
    //PAUSE;
    return 0;
}

 

你可能感兴趣的:(STL,CF)