隔离区

codeforces 1251E (贪心)

ε祈祈猫儿з 提交于 2019-12-02 19:45:58
传送门 很巧妙的贪心. 我想用最少的钱让所有人都给我投票. 思路: 对于所有$m$值为$i$的人, 都必须满足已选人数$>i$才行. 如果$i+1$的人满足了, 那么$i$的人也会被满足, 那么我们可以从$n$到$0$来贪心. 我们可以先将所有$m$值为$i$的人放到一个"隔离区", 假设隔离区里的人都不被收买, 那么被收买的人的个数就是$n-size$, $n$是总人数, $size$就是"隔离区"里人的个数. 如果$n-size<i$, 就说明放入"隔离区"的人多了啊, 我们应该将其中的人"赎"出来, 为了付出最少的代价使得$n-size>=i$, 我们可以使用优先队列来作为这个"隔离区", 将$p$最小的人一个一个往外买就对了. ======================================== CF 的 E 题哪怕是个贪心也是真的难啊orz #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <vector> #include <queue> #include <algorithm> #define MAXN 200010 using namespace std; typedef long long LL; int T,n; vector