本文主要是介绍E2. Voting (Hard Version)(思维),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
有 n 个人,每个人有 mi 和 pi ,mi 代表着如果有 mi 个人投票给他,那么他就免费投票给他,否则你需要花费pi的代价来收买他。请问最少花费多少使得所有人都投他。
看到 m 数组的数据范围,m 数组作为数组下标应该是没得跑了,有贪心策略我们应该选择 pi 尽量少的那些人,但是同时要照顾到 m 数组。
因为要贿赂的总人数我们不知道,但借用优先队列(小根堆),将目前为止的最少需要的贿赂人数贿赂。
向题目中提到的:m :1 2 2 4 5,只需贿赂 m[5] 即可,这样贪心策略就出来了:把这些 m 偏大的人先贿赂了,贿赂的最少人数为 n-i (i 为 m 数组的下标)
vector<int> 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<int>,greater<int> >q;ll ans=0;for(i=n;i>=0;i--){int len=v[i].size();for(j=0;j<len;j++) q.push(v[i][j]);while(q.size()>n-i){//到此时为止必须有 n-i 个人为其投票 ans+=q.top();q.pop();}}pll(ans);}//PAUSE;return 0;
}
这篇关于E2. Voting (Hard Version)(思维)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!