有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<algorithm>
#include<stdio.h>
using namespace std;
struct ac{
int e,w;
}a[50001];
bool cmp(struct ac x,struct ac y){
// if(x.e!=y.e)
return x.e>y.e;
// else
// return x.w>y.w;
}
int main()
{
int n;
scanf("%d",&n);
int b[50001]={0};
int j,k,i,t;
long long l=0;
for(j=0;j<n;j++){
scanf("%d%d",&a[j].e,&a[j].w);
}
sort(a,a+n,cmp);
for(j=n-1;j>0;j--){
i=0;
for(k=0;k<n;k++){
if(a[k].e<j)
break;
if(a[k].w>i){
i=a[k].w;
t=k;
}
// if(a[k].e==j)
// break;
}
l+=i;
a[t].w=0;
}
printf("%lld\n",l);
return 0;
}
这个代码超时! 目前还不会优化