51nod 1163-最高的奖励

来源:互联网 发布:孩子气的战争动作数据 编辑:程序博客网 时间:2024/05/29 14:04

题目链接:51nod 1163-最高的奖励

有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。


解决方法是贪心法,首先耗时都是固定的1个单位时间,时间没有上限,但实际总耗时一定小于等于最晚结束的事件的结束时间,未保证和最大,不能简单根据结束时间先后来选取,应该根据权重来贪心。

具体规则就是最晚结束时间开始往前,每次选出当前时间下所能选择的权重最大的事件,没有则跳过当前时间继续往前,这样就能保障结果最大了

代码:

#include<iostream>#include<climits>#include<vector>#include<algorithm>#include<queue>using namespace std;struct node{   int endtime;   int value;   bool operator < (node x){      if(value!=x.value)return value>x.value;      else return endtime>x.endtime;   }};vector<node> all;int main(){   node u;   int n;   cin>>n;   int maxtime=-1;   while(n--){      cin>>u.endtime>>u.value;      all.push_back(u);      if(u.endtime>maxtime)maxtime=u.endtime;   }   long long ans=0;   sort(all.begin(),all.end()); //事先排序方便选取出合适的事件   while(maxtime>0){      for(vector<node>::iterator i=all.begin();i!=all.end();i++){         if(i->endtime>=maxtime){            ans+=i->value;            i=all.erase(i);            break;         }      }      maxtime--;   }   cout<<ans;}


原创粉丝点击