【洛谷 2889】 [USACO07NOV]Milking Time S

题目描述

Bessie 可以在接下来 NN 个小时内产奶,为了方便,我们把这 NN 个小时 0\dots N-10N1 编号。

FJ 在这 NN 个小时内有 MM 段时间可以来给 Bessie 挤奶,第 ii 段时间从 Start_iStarti 开始到 End_iEndi 结束,可以得到 Eff_iEffi 加仑牛奶。

每次 FJ 给 Bessie 挤奶之后,Bessie 都要休息 RR 个小时,FJ 才能开始下一次挤奶。

现在,FJ 需要您计算出 Bessie 在这 NN 个小时内最多产多少奶。

输入格式

第一行有三个整数,分别表示 N,M,RN,M,R。

第 2\dots M+12M+1 行,第 i+1i+1 行有三个整数 Start_i,End_i,Eff_iStarti,Endi,Effi,描述一段挤奶的时间。

输出格式

输出一行一个整数表示答案。

输入输出样例

输入 #1
12 4 2
1 2 8
10 12 19
3 6 24
7 10 31
输出 #1
43

说明/提示

数据规模与约定

对于全部的测试点,保证 1\le N\le 10^61N106,1\le M\le 10^31M103,1\le Start_i<end_i\le N1Starti<endiN,1\le Eff_i\le 10^61Effi106。

 

题解:可以spfa跑最长路或者dp都可

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=100005;
struct node{
    int x,y,z,next;
}a[N];
int f[N],head[N],n,m,r,xx,yy,zz;
int main(){
    freopen("2889.in","r",stdin);
    freopen("2889.out","w",stdout);
    scanf("%d %d %d",&n,&m,&r);
    for(int i=1;i<=m;i++){
        scanf("%d %d %d",&a[i].x,&a[i].y,&a[i].z);
        a[i].next=head[a[i].y];
        head[a[i].y]=i;
    }
    for(int j=1;j<=n;j++){
        f[j]=f[j-1];
        for(int i=head[j];i;i=a[i].next)
            f[j]=max(f[j],f[max(a[i].x-r,0)]+a[i].z);
    }
    cout<<f[n];
    return 0;
}

 

posted @ 2020-10-27 20:34  #Cookies#  阅读(119)  评论(0编辑  收藏  举报