codeforces 1251 E1(easy version)&& E2 (hard version)Voting(贪心,反向思维)

 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;
}
发布了204 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/error311/article/details/102757350