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;
}