基准时间限制: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示例
7 4 20 2 60 4 70 3 40 1 30 4 50 6 10
Output示例
230
题意:中文题目不解释
思路:让你求能够得到的最高奖励,在截止时间之前都可以选择,用一个优先队列存可能得到的奖励,根据时间从大到小处理,当进入一个新的时间点或时间段时跟新答案,主要是贪心思想配合上优先队列。
#include<stdio.h>
#include<string.h>
#include<cmath>
#include<stdlib.h>
#include<time.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#define ll long long
#define qq printf("QAQ\n");
using namespace std;
const int maxn=1e5+5;
struct node{
int t;
ll w;
}a[maxn];
bool cmp(node a,node b)
{
return a.t>b.t;
}
int main()
{
int n,m,w;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d%lld",&a[i].t,&a[i].w);
}
sort(a,a+n,cmp);
priority_queue<int,vector<int>,greater<int> >q1;//小的优先
priority_queue<ll>q;//大者优先
int f=-1;
ll ans=0;
for(int i=0;i<=n;i++)
{
if(f==-1||a[i].t==f){
q.push(a[i].w);
f=a[i].t;
}
else {
while(f!=a[i].t&&!q.empty())
{
ans+=q.top();
q.pop();
f--;
}
q.push(a[i].w);
f=a[i].t;
}
}
printf("%lld\n",ans);
}
return 0;
}