基准时间限制: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<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int f[50005];
struct wen
{
long long a,b;
}s[50005];
int gao(wen x,wen y)
{
return x.b>y.b;//按照价值的大小来降序排列
}
int fff(int x)
{
if(x<=0)return -1;
if(f[x]==x)return f[x]=x-1;//尽量找最晚时间来完成并判断当前时间点是否被占用 //总感觉我的理解有点不对希望大家来指正
else return f[x]=fff(f[x]);//就是被占用了就找下一个 因为在最晚时间前完成都能获得奖励
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j;
for(i=0;i<n;i++)
{
scanf("%lld%lld",&s[i].a,&s[i].b);
f[i]=i;
}
sort(s,s+n,gao);
long long sum=0;
for(i=0;i<n;i++)
{
j=s[i].a;
if(fff(j)>=0) //为啥大于零 因为数组从零开始的。。
sum+=s[i].b;
}
printf("%lld\n",sum);
}
}