Milking Time
?POJ - 3616?
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?has a starting hour (0 ≤?starting_houri?≤?N), an ending hour (starting_houri?<?ending_houri?≤?N), and a corresponding efficiency (1 ≤?efficiencyi?≤ 1,000,000) which indicates how many gallons of milk that he can get out of Bessie in that interval. Farmer John starts and stops milking at the beginning of the starting hour and ending hour, respectively. When being milked, Bessie must be milked through an entire interval.
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,?M, and?R
* Lines 2..M+1: Line?i+1 describes FJ's ith milking interval withthree space-separated integers:?starting_houri?,?ending_houri?, and?efficiencyi
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,n代表最大時間,下面m行分別輸入三個整數s,e,eff,表示從s時刻開始到e時刻結束共能收獲eff的價值,注意每兩段工作時間之間必須間隔r小時。
解決方法:先將其按照開始時間從小到大排序,然后求出dp[i]=max(dp[i],dp[j]+arr[i].eff)。
AC代碼:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <set>
#include <utility>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define lep(i,l,r) for(int i=l;i>=r;i--)
#define ms(arr) memset(arr,0,sizeof(arr))
//priority_queue<int,vector<int> ,greater<int> >q;
const int maxn = (int)1e5 + 5;
const ll mod = 1e9+7;
struct node
{int s;int e;int eff;
}arr[1200];
bool cmp(node a,node b)
{if(a.s==b.s)return a.e<b.e;elsereturn a.s<b.s;
}
int dp[1200];
int main()
{//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);ios::sync_with_stdio(0),cin.tie(0);int n,m,r;cin>>n>>m>>r;rep(i,1,m) {cin>>arr[i].s>>arr[i].e>>arr[i].eff;}sort(arr+1,arr+1+m,cmp);int ans=-1;for(int i=1;i<=m;i++){dp[i]=arr[i].eff;for(int j=1;j<i;j++){if(arr[j].e+r<=arr[i].s){dp[i]=max(dp[i],dp[j]+arr[i].eff);}}ans=max(ans,dp[i]);}cout<<ans<<endl;return 0;
}
?