有 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+p();q.pop();}}pll(ans);}//PAUSE;return 0;
}
本文发布于:2024-01-28 13:11:17,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064186817658.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |