题目
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.
输入
- 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.
输出
- Line 1: The maximum number of gallons of milk that Bessie can product in the N hours.
样例
Input
12 4 2
1 2 8
10 12 19
3 6 24
7 10 31
Output
43
题意
第一行输入三个整数N(总时间),M(工作时间段的数量),R(每次工作完要休息r个小时)。
接下来M行,每行三个整数ST(开始时间),ET(结束时间),V(工作收获)。
输出在总时间内能获得的最大的工作收获。
思路
首先我们按照结束时间从小到大对所有数据排序。
接下来这道题就变成了一个01背包。dp数组此处的含义是在考虑前i个工作段之后能得到的最大工作收获。
废话不多说,上代码!
伊丽莎白!
代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
struct node
{
int st,et,v;
}cow[1005];
int dp[1005];
bool cmp(node a,node b) //排序函数
{
return a.et<b.et;
}
int main()
{
int n,m,r;
int ans=-1;
cin>>n>>m>>r;
for(int i=1; i<=m; i++)
{
cin>>cow[i].st>>cow[i].et>>cow[i].v;
}
sort(cow+1,cow+1+m,cmp);
memset(dp,0,sizeof(dp));
for(int i=1; i<=m; i++)
{
dp[i]=cow[i].v; //第i个工作区间初值就应该是它自己的价值(只做第i件事)
for(int j=1; j<i; j++)
{
if(cow[j].et+r<=cow[i].st) //如果两个事件之间间隔超过R就可以考虑做不做(人总是要休息)
dp[i]=max(dp[i],dp[j]+cow[i].v);
}
ans=max(dp[i],ans);
}
cout<<ans<<endl;
}
溜了溜了~~