51Nod

来源:互联网 发布:中转国际机票 知乎 编辑:程序博客网 时间:2024/05/17 05:03

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示例
74 202 604 703 401 304 506 10
Output示例
230


题意:给定n个任务 每个任务有最晚完成期限和价值 求在一定时间内可以获得的最大的价值


思路:贪心 每次找价值最大的 看有没有时间做 用num数组记录每个时间点是不是被用过了已经


#include <iostream>#include <queue>#include <cstdio>#include <stack>#define ll long longusing namespace std;int num[51000];struct z{int time;int w;bool operator < (const z &a)const{if(a.w==w)return a.time<time;return a.w>w;}};int main(){int n;scanf("%d",&n);int i;priority_queue<z>q;struct z task[n];for(i=0;i<n;i++){scanf("%d %d",&task[i].time,&task[i].w);q.push(task[i]);}int t=1,j;ll k=0,count=0;ll sum=0;for(i=0;i<n;i++){if(num[q.top().time]==0){num[q.top().time]=1;sum+=q.top().w;q.pop();}else{for(j=q.top().time;j>0;j--){if(num[j]==0){num[j]=1;sum+=q.top().w;break;}}q.pop();}}printf("%lld\n",sum);}


原创粉丝点击