Milking Time

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值