51nod1163 最高的奖励

1163 最高的奖励
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
收藏
关注
有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
Input
第1行:一个数N,表示任务的数量(2 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及对应的奖励W[i]。(1 <= E[i] <= 10^9,1 <= W[i] <= 10^9)
Output
输出能够获得的最高奖励。
Input示例
7
4 20
2 60
4 70
3 40
1 30
4 50
6 10
Output示例
230

思路: 优先队列按照时间少值大的排序,然后用另一个优先队列储存能够完成的任务,这个优先级是值最小的在上面,如果再添加任务但是时间不够时就弹出值最小的。

Code:

#include 
#define LL long long
using namespace std;
struct Node
{
	LL t; 
	LL val;
};
struct cmp1{
	bool operator() ( Node a , Node b ){
		if( a.t == b.t ) return a.val < b.val;
		else return a.t > b.t;
	}
};
struct cmp2{
	bool operator() ( Node a , Node b ){
		if( a.val == b.val ) return a.t > b.t;
		else return a.val > b.val;
	}
};
int main(){
	priority_queue , cmp1 > q; 
	priority_queue , cmp2 > c; 
	LL n ;
	cin >> n;
	LL time , value ;
	Node tmp0 ;
	for( int i = 0 ; i < n ; i ++ ){
		cin >> time >> value;
		tmp0.t = time ;
		tmp0.val = value;
		q.push(tmp0);
	}
	while( !q.empty() ){
		Node tmp = q.top();
		q.pop();
		LL size = c.size();
		if( size < tmp.t ){
			c.push(tmp);
		}else{
			Node tmp2 = c.top();
			if( tmp2.val < tmp.val ){
				c.pop();
				c.push(tmp);
			}
		}
	}
	LL res = 0;
	while( !c.empty() ){
		Node tmp = c.top();
		res += tmp.val;
		c.pop();
	}
	cout << res << endl;
	return 0;
}

你可能感兴趣的:(51nod1163 最高的奖励)