洛谷 P2949 [USACO09OPEN]Work Scheduling G

題目傳送門

正難則反,根據時間從後往前倒着看,只要每到一個時間節點,能加任務就加任務,然後選一個受益最大的任務.(注意,時間0也可能有任務)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>

using namespace std;

int n,p;
long long ans;
struct kkk{
	int t,m;
}e[100001];
priority_queue<int> q;

inline bool cmp(kkk a,kkk b) {
	return a.t < b.t;
}

int main() {
	scanf("%d",&n);
	for(int i = 1;i <= n; i++)
		scanf("%d%d",&e[i].t,&e[i].m);
	sort(e+1,e+n+1,cmp);
	p = e[n].t;
	while(n > 0) {
		for(n;n >= 0; n--) {
			if(e[n].t == p) q.push(e[n].m);
			else  {
				p = e[n].t;
				break;
			}
		}
		for(int i = 1;i <= e[n+1].t - e[n].t; i++) {
			if(q.empty()) break;
			int u = q.top();
			q.pop();
			ans += u;
		}
	}
	printf("%lld",ans);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章