有N个任务,每个任务有一个最晚结束时间以及一个对应的奖励。在结束时间之前完成该任务,就可以获得对应的奖励。完成每一个任务所需的时间都是1个单位时间。有时候完成所有任务是不可能的,因为时间上可能会有冲突,这需要你来取舍。求能够获得的最高奖励。
第1行:一个数N(2≤N≤100000),表示任务的数量。
第2~N+1行,每行两个数,中间用空格分隔,表示任务的最晚结束时间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
先把任务按时间从后往前排序。从最后结束任务时间开始循环,每到任务的结束时间就把这些任务加进优先队列,每一个时间取奖励最高值先做。
按时间排序:
70
50
30 60 40 20 10
1 2 3 4 5 6 7
6min:加入奖励为10的任务,并完成。
奖励值:10
5min:无任务可做。
奖励值:10
4min:加入奖励为70,50,20的任务,取最高值70完成。
奖励值:10+70=80
3min:加入奖励为40的任务,共有奖励为50,40,20的任务,取最高值50完成。
奖励值:80+50=130
2min:加入奖励为60的任务,共有奖励为60,40,20的任务,取最高值60完成。
奖励值:130+60=190
1min:加入奖励为30的任务,共有奖励为40,30,20的任务,取最高值40完成。
奖励值:190+40=230
最高奖励值即为230。
#include<bits/stdc++.h>
using namespace std;
struct Node{int x,y;};//时间和奖励
priority_queue<int,vector<int>,less<int> >q;//单调增优先队列
vector<Node>v;//记录任务的vector
int n,t;//任务数量与最晚任务可完成时间
bool cmp(Node,Node);//比较函数
int main(){
cin>>n;
for (int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
v.push_back({x,y});
}//读入
sort(v.begin()+1,v.end(),cmp);//排序
t=v.front().x;//记录最晚时间
for (int i=t;i>=1;i++){
}//不知道该咋写的for循环,求助
return 0;
}
bool cmp(Node a,Node b){
if (a.x!=b.x) return a.x>b.x;
return a.y>b.y;
}