【洛谷P2889】Milking Time

时间:2023-12-14 13:32:56

很容易想到以结束时间加上R从小到大排序

之后怎样呢?

我们按层考虑,f[i]表示前i个时间段嫩得到的最大价值

每次枚举其之前的状态,如果其ed<当前i的st,那么取max即可

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
int n,m,r,f[N];
struct fx{
int st,ed,v;
}c[N];
bool cmp(fx a,fx b){
return a.ed<b.ed;
}
int read(){
int sum=;
char ch=getchar();
while (ch<''||ch>'')
ch=getchar();
while (ch>=''&&ch<=''){
sum=sum*+ch-'';
ch=getchar();
}
return sum;
}
int main(){
int st,ed,v,ans=;
n=read();
m=read();
r=read();
for (int i=;i<=m;i++){
c[i].st=read();
c[i].ed=read()+r;
c[i].v=read();
}
sort(c+,c+m+,cmp);
for (int i=;i<=m;i++){
f[i]=c[i].v;
for (int j=;j<i;j++){
if (c[i].st>=c[j].ed)
f[i]=max(f[i],f[j]+c[i].v);
ans=max(ans,f[i]);
}
}
printf("%d",ans);
return ;
}