题目大意:
给出n个任务,每个任务有价值,而且必须在s[i]到t[i]时刻内的某一时刻完成,问最大价值
思路:
我们首先发现,最多有n个时刻被选,所以那么多的时刻是没有用的
我们直接离散化掉
怎么离散化呢?
肯定是按每个任务最开始的时刻来离散化。
然后我们发现,价值大的可以往前放。因为如果一个更小的放了,那肯定是更大的放更优。
那我们就一步一步实现就行了。
c o d e code code
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n;
struct node
{
long long v, s, t;
}a[5010];
long long S[5010], b[10010];
long long f[5010];
bool cmp(node x, node y)
{
return x.s<y.s;
}
bool cmp2(node x, node y)
{
return x.v>y.v;
}
void get_point()
{
for(long long i=1; i<=n; i++)
S[i]=max(S[i-1]+1, a[i].s);
}
void lsh()
{
for(long long i=1; i<=n; i++)
{
int j=1;
while(S[j]<a[i].s) j++;
a[i].s=j;
}
}
bool find_(long long x, long long i)
{
if(S[x]>a[i].t)
return 0;
if(f[x]==0)
{
f[x]=i;
return 1;
}
long long j=f[x];
if(a[i].t>a[j].t)
return find_(x+1, i);
else if(find_(x+1, j))
{
f[x]=i;
return 1;
}
return 0;
}
int main()
{
scanf("%lld", &n);
for(long long i=1; i<=n; i++)
scanf("%lld%lld%lld", &a[i].s, &a[i].t, &a[i].v);
sort(a+1, a+1+n, cmp);
get_point();
sort(a+1, a+1+n, cmp2);
lsh();
long long ans=0;
for(long long i=1; i<=n; i++)
if(find_(a[i].s, i))
ans+=a[i].v;
printf("%lld", ans);
return 0;
}