【题目大意】
奶牛Bessie在0~N时间段产奶。农夫约翰有M个时间段可以挤奶,时间段[a,b]Bessie能挤到的牛奶量v。奶牛产奶后需要休息R小时才能继续下一次产奶,求Bessie最大的挤奶量。
【思路】
首先按各个时间段的开始时间进行排序。f[i]表示到第i个时间段位置挤奶量的最大值。
对于当前时间段,如果它之前的时间段的结束时间+休息时间≤当前时间段的开始时间(cow[j].e+r<=cow[i].s),那么进行比较(f[i]=max(f[i],f[j]+cow[i].v))。
【易错点】
注意f[i]的初值是cow[i].v,即只有当前时间段挤奶。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 using namespace std; 7 const int MAXN=1000+50; 8 struct node 9 { 10 int s,e,v; 11 bool operator < (const node &x) const 12 { 13 return s<x.s; 14 } 15 }cow[MAXN]; 16 int f[MAXN]; 17 int n,m,r; 18 19 int main() 20 { 21 scanf("%d%d%d",&n,&m,&r); 22 for (int i=0;i<m;i++) 23 { 24 scanf("%d%d%d",&cow[i].s,&cow[i].e,&cow[i].v); 25 } 26 sort(cow,cow+m); 27 28 for (int i=0;i<m;i++) f[i]=cow[i].v; 29 for (int i=1;i<m;i++) 30 for (int j=0;j<i;j++) 31 { 32 if (cow[j].e+r<=cow[i].s) 33 f[i]=max(f[i],f[j]+cow[i].v); 34 } 35 36 int ans=-1; 37 for (int i=0;i<m;i++) ans=max(ans,f[i]); 38 cout<<ans<<endl; 39 return 0; 40 }