Descriptions
贝茜是一个勤劳的牛。事实上,她如此专注于最大化她的生产力,于是她决定安排下一个N(1≤N≤1,000,000)小时(方便地标记为0…N-1),以便她生产尽可能多的牛奶。
农民约翰有一个M(1≤M≤1,000)可能重叠的间隔列表,他可以在那里进行挤奶。每个区间我有一个起始小时(0≤starting_houri≤N),一个结束小时(starting_houri <ending_houri≤N),以及相应的效率(1≤efficiencyi≤1,000,000),表示他可以从中获取多少加仑的牛奶。贝西在那段时间。 Farmer John分别在开始时间和结束时间开始时开始和停止挤奶。在挤奶时,Bessie必须在整个间隔内挤奶。
尽管贝茜有其局限性。在任何间隔期间挤奶后,她必须休息R(1≤R≤N)小时才能再次开始挤奶。鉴于Farmer Johns的间隔清单,确定Bessie在N小时内可以产生的最大牛奶量。
Input
*第1行:三个以空格分隔的整数:N,M和R
*第2行.M +1:第i + 1行描述FJ的第i个挤奶间隔,其中包含三个以空格分隔的整数:开始时间i,结束时间 i和效率i
Output
*第1行:Bessie在N小时内可以产生的最大加仑牛奶数
Sample Input
12 4 2
1 2 8
10 12 19
3 6 24
7 10 31
Sample Output
43
将结束时间加上R,并以开始时间从小到大排序。dp[i]为前i种的最大牛奶数量。如果j的结束时间小于等于i的开始时间,则i可以在j的基础上面转移而来:dp[i]=max(dp[i],dp[j]+k);
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
int x,y,z;
} q[100011];
int dp[100010];
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
int n,m,r,i,j,ans=-1;
scanf("%d %d %d",&n,&m,&r);
for(i=0; i<m; i++)
{
scanf("%d %d %d",&q[i].x,&q[i].y,&q[i].z);
q[i].y+=r;
}
sort(q,q+m,cmp);
for(i=0; i<m; i++)
{
dp[i]=q[i].z;
for(j=0;j<i;j++)
{
if(q[i].x>=q[j].y)
dp[i]=max(dp[i],dp[j]+q[i].z);
}
}
for(i=0; i<m; i++)
ans=max(ans,dp[i]);
printf("%d\n",ans);
}