题目链接:http://poj.org/problem?id=3616
题目大意:
一个人有m个时间段给奶牛挤奶,每一个时间段都有一个开始时间一个结束时间和一个挤奶量,奶牛每个时间段过后要休息 r 小时,问最多可以得到多少牛奶。
题目思路:
就是有个贪心的题问给一些时间的开头和结尾,怎么选时间段才能做最多的事。解就是按照结束时间排序,找最长的不相交段。这个题也有那么个意思,要按照时间结尾排序,再模拟最长上升子序列的做法,求满足时间差r的段更新dp值。代码很简单
#include<iostream>
#include<string.h>
#include<algorithm>
#define ll long long
using namespace std;
struct Point{
int st,en;
ll enf;
}C[1005];
ll dp[1005];
bool cmp(Point a,Point b){
return a.en<b.en;
}
int main()
{
ll n,k,r;
while(cin>>n>>k>>r){
//cout<<1<<endl;
memset(dp,0,sizeof(dp));
for(int i=0;i<k;i++){
cin>>C[i].st>>C[i].en>>C[i].enf;
//dp[i]=C[i].enf;
}
// cout<<1<<endl;
sort(C,C+k,cmp);
dp[0]=C[0].enf;
for(ll i=1;i<k;i++){
dp[i]=C[i].enf;
for(ll j=0;j<i;j++){
if(C[i].st-C[j].en>=r){
dp[i]=max(dp[i],dp[j]+C[i].enf);
}
}
}
ll ans=0;
for(ll i=0;i<k;i++){
ans=max(ans,dp[i]);
}
cout<<ans<<endl;
}
}