E1(easy version)&& E2 (hard version)Voting(貪心,反向思維)
題目鏈接:codeforces 1251 E2
題意:
有 n 個人投票,每人對應一個m[i], p[i],第 i 個人 m[i] 指的是,如果有 m[i] 個人已經把票投給你了,那麼他也會把票免費投給你,否則你就花費p[i]讓他把票投給你。爲了讓所有的人都把票投給你,問你需要的最少花費是多少?
解題思路:
從後往前的遍歷,如果還未投你票的人數k 滿足 n - k < i (i從n遞減),那麼就可以免費得票,否則就需要買最便宜的票
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
typedef long long ll;
vector<int> v[maxn];
int main(){
int t;
scanf("%d", &t);
while(t--){
int m, p, n;
scanf("%d", &n);
for (int i = 0; i <= n; i++){
v[i].clear();
}
for(int i = 1; i <= n; i++){
scanf("%d%d", &m, &p);
v[m].push_back(p);
}
ll ans = 0;
priority_queue<int, vector<int>, greater<int>> Q;
for(int i = n; i >= 0; i--){
int len = v[i].size();
for(int j = 0; j < len; j++){
Q.push(v[i][j]);
}
while(Q.size() > n - i){
ans += Q.top();
Q.pop();
}
}
printf("%lld\n", ans);
}
return 0;
}