优先队列-51nod1163最高的奖励

基准时间限制:1 秒 空间限制:131072 KB 分值: 20 
有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

把任务按时间排序,能完成的就完成,不能同时完成的选择其中的价值大者,用优先队列实现

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;


int inn()  读入优化

{
char a=getchar();
int ans(0),ok(1);
while((a<'0'||a>'9')&&a!='-') a=getchar();
if(a=='-') {
  a=getchar();
  ok=-1;
  }
while(a>='0'&&a<='9') {
  ans=ans*10+a-'0';
  a=getchar();
  }
return ans*ok;
}


struct no{
ll t,m;
bool operator<(const no &u)const{
  if(m!=u.m) return m>u.m;
  return t<u.t;
}
}nu[50010];


bool com(no a,no b)  按时间小排序,时间相同则按价值大排序

{
if(a.t!=b.t) return a.t<b.t;
return a.m>b.m;
}


int main()
{
ll n=inn(),i,j,ans(0),t(0);
priority_queue<no> q;  优先队列
for(i=0;i<n;i++)
  nu[i].t=inn(),nu[i].m=inn();
sort(nu,nu+i,com);
for(i=0;i<n;i++){
  if(nu[i].t>t) q.push(nu[i]),t++;  时间大就加入
  else if(nu[i].t==t)  时间相同则选择价值大的
    if(q.top().m<nu[i].m)
    q.pop(),q.push(nu[i]);
  }
while(!q.empty())
  ans+=q.top().m,q.pop();  计算
printf("%lld\n",ans);
return 0;
}

 
posted @ 2016-09-20 20:02  wengsy150943  阅读(240)  评论(0)    收藏  举报