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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章