有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
第2 - N + 1行,每行2个数,中间用空格分隔,表示任务的最晚结束时间E i i以及对应的奖励W i i。(1 <= E i i <= 10^9,1 <= W i i <= 10^9)
7 4 20 2 60 4 70 3 40 1 30 4 50 6 10
230
#include <cstdio> #include <algorithm> #include <queue> using namespace std; int vis[1000000]; struct A { int e; long long vlaue; } f[50001]; bool cmp(A x,A y) { if(x.vlaue!=y.vlaue) return x.vlaue>y.vlaue; return x.e<y.e; } int main() { int n; while(~scanf("%d",&n)) { long long ans=0; for(int i=0; i<n; i++) scanf("%d %lld",&f[i].e,&f[i].vlaue); sort(f,f+n,cmp); for(int i=0;i<n;i++) { for(int j=f[i].e;j>=1;j--) { if(!vis[j]&&j<=f[i].e) { ans+=f[i].vlaue; vis[j]=1; break; } } } printf("%lld\n",ans); } return 0; }