Milking Time
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as possible.
Farmer John has a list of M (1 ≤ M ≤ 1,000) possibly overlapping intervals in which he is available for milking. Each interval i
Even Bessie has her limitations, though. After being milked during any interval, she must rest R (1 ≤ R ≤ N) hours before she can start milking again. Given Farmer Johns list of intervals, determine the maximum amount of milk that Bessie can produce in the N hours.
Input
* Line 1: Three space-separated integers: N
Output
* Line 1: The maximum number of gallons of milk that Bessie can product in the Nhours
Sample Input
12 4 2 1 2 8 10 12 19 3 6 24 7 10 31
Sample Output
43
題意:在N時間內,有M組時間段,每個時間段對應一個價值,要求某個時間段的結束時間與另一個段的開始時間間隔大於等於R,對應價值相加,求最後能得到的最大價值的和。
思路:先按照結束時間,把時間段按升序排列,然後將第一個時間段的結束時間賦值給dp[0],dp[i]表示從開始取到第i段所能達到的最大價值,雙重迴圈遇到第i段之前某個段結束時間加上R小於等於第i段的開始時間,則更新dp[i]。
#include<iostream>
#include<algorithm>
using namespace std;
int N,M,R;
struct hah
{
int b;
int e;
int w;
};
bool cmp(hah a,hah b)
{
if(a.e<b.e)
return true;
return false;
}
int main()
{
hah m[1001];
int dp[100001];
cin>>N>>M>>R;
for(int i=0; i<M; i++)
cin>>m[i].b>>m[i].e>>m[i].w;
sort(m,m+M,cmp);//按照結束時間從小到大排序
int res=0;
for( int i=0; i<M; i++)
{
dp[i]=m[i].w;//dp[i]表示從開始取到第i段所能達到的最大數目。
for(int j=0; j<i; j++)//如果第i段之前某個段結束時間加上R小於等於i段的開始時間,則更新dp[i]。
if(m[j].e+R<=m[i].b)
dp[i]=max(dp[i],dp[j]+m[i].w);
res=max(res,dp[i]);
}
cout<<res<<endl;
return 0;
}