题目:
D - Milking Time
奶牛在给定的时间内可以挤奶,不过每次挤奶后就要休息,农场主有不同的时间片段可以挤牛奶,当然时间可以重叠,问在那些时间段挤奶可以获得最多的牛奶;
此题只需要将时间片段的右边的值加上需要休息的时间就会变成不需要考虑休息时间的问题。
现将时间段按照yy从小到大的顺序排序,dp[i]代表i段时间可以有的最多的奶,就变成一个类似简单的求最长上升子序列的问题
代码:#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int dp[1111],n,m,r;
struct node
{
int y;
int yy;
int z;
int v;
}nai[1111];
bool cmp(const node &a,const node &b)
{
if(a.yy!=b.yy) return a.yy<b.yy;
else if(a.z!=b.z) return a.z<b.z;
else return 0;
}
int main()
{
int res;
while(scanf("%d %d %d",&n,&m,&r)!=EOF)
{
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&nai[i].z,&nai[i].y,&nai[i].v);
nai[i].yy=nai[i].y+r;//此时不用考虑休息的问题了
}
sort(nai,nai+m,cmp);
res=0;
for(int i=0;i<m;i++)
{
dp[i]=nai[i].v;
for(int j=0;j<i;j++)
{
if(nai[j].yy<=nai[i].z)
dp[i]=max(dp[j]+nai[i].v,dp[i]);
}
res=max(res,dp[i]);
}
printf("%d\n",res);
}
return 0;
}