(mark) zznu 我只看看不寫題(貪心+優先隊列)

G : 我只看看不寫題

Progress Bar

時間限制:1 Sec 內存限制:128 MiB
提交:155 答案正確:39

提交


題目描述

伴隨着科技的發展,我們的生活也越來越多姿多彩,隨着手機的普及,各種交友軟件也在快速的發展。
小a是個老實人,當然只是自己理解而已,其實小a是個不折不扣的渣男。因爲他在有女朋友的同時,還在瘋狂的撒網,利用各種交友軟件尋求更適合自己的伴侶。
小a女朋友當然不是省油的燈,自然瞭解小a的本性,所以在每次見面時就會翻看小a的軟件記錄,來了解小a近期的狀況,機智的小a當然會在女朋友來之前就給完全清理乾淨了。
終於在某次時間緊急的情況下,小a的軟件記錄並不一定能夠完全刪除,但是小a知道,自己每個軟件記錄的火熱程度以及最終刪除時間(即可以刪除的最晚時間,過時將無法刪除)。每個軟件記錄的刪除需要一分鐘,軟件記錄的火熱程度,正好對應着女朋友的刺激值,小a想知道,在有限的時間內,如何才能夠讓女朋友的刺激值最小,求出最小值。

輸入

第一行一個正整數T。表示樣例個數(0<T<10)
每組有兩個整數n,m,分別表示一共有n個軟件以及女朋友到來的時間(0<n<=10^5,0<m<=10^6)
往下對應着n行,每行有兩個正整數e,f分別對應每個軟件記錄的火熱程度和該軟件的最終刪除時間。(0<e<=10^5,0<f<=10^6)
題目中涉及到的時間全部以分鐘爲單位。

輸出

	輸出對女朋友的最小刺激值;結果佔一行。

樣例輸入

複製
2
4 2
20 1
10 1
30 2
40 2
6 2
20 1
10 1
30 2
40 2
50 3
60 3

樣例輸出

複製
30
100

#include<stdio.h>
#include<algorithm>
#include<queue>
using namespace std;
#define ll long long
struct Node{
	int score,time;
	friend bool operator < (const Node &a,const Node &b){
	return a.score<b.score;
	}
}node[100005];
int cmp(Node a,Node b){
	return a.time>b.time;
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int n,m;
		scanf("%d%d",&n,&m);
		ll ans=0,sum=0;
		for(int i=1;i<=n;i++){
			scanf("%d%d",&node[i].score,&node[i].time);
			sum+=node[i].score;
		}
		sort(node+1,node+1+n,cmp);
		
		int j=1;
		priority_queue<Node>q;
		for(int i=m;i>=1;i--){
			while(node[j].time>=i&&j<=n){
				q.push(node[j++]);
			}
			if(!q.empty()){
				ans=ans+q.top().score;
				q.pop();
			}
		}
		printf("%lld\n",sum-ans);
	}
	return 0;
}

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