优先队列-51nod1163最高的奖励
第1行:一个数N,表示任务的数量(2 <= N <= 50000)
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E[i]以及对应的奖励W[i]。(1 <= E[i] <= 10^9,1 <= W[i] <= 10^9)
输出能够获得的最高奖励。
7
4 20
2 60
4 70
3 40
1 30
4 50
6 10
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;
}

浙公网安备 33010602011771号