代码求助
  • 板块学术版
  • 楼主liufukang
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/1/9 10:44
  • 上次更新2023/11/5 05:00:55
查看原帖
代码求助
139509
liufukang楼主2021/1/9 10:44

最高奖励(优先队列)

题面

有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;
}
2021/1/9 10:44
加载中...