zoukankan      html  css  js  c++  java
  • BZOJ 1642: [Usaco2007 Nov]Milking Time 挤奶时间

    Description

    贝茜是一只非常努力工作的奶牛,她总是专注于提高自己的产量。为了产更多的奶,她预计好了接下来的N (1 ≤ N ≤ 1,000,000)个小时,标记为0..N-1。 Farmer John 计划好了 M (1 ≤ M ≤ 1,000) 个可以挤奶的时间段。每个时间段有一个开始时间(0 ≤ 开始时间 ≤ N), 和一个结束时间 (开始时间 < 结束时间 ≤ N), 和一个产量 (1 ≤ 产量 ≤ 1,000,000) 表示可以从贝茜挤奶的数量。Farmer John 从分别从开始时间挤奶,到结束时间为止。每次挤奶必须使用整个时间段。 但即使是贝茜也有她的产量限制。每次挤奶以后,她必须休息 R (1 ≤ R ≤ N) 个小时才能下次挤奶。给定Farmer John 计划的时间段,请你算出在 N 个小时内,最大的挤奶的量。

    Input

    第1行三个整数N,M,R.接下来M行,每行三个整数Si,Ei,Pi.

    Output

    最大产奶量.

    题解:

    首先把时间段按结束时间排序,定义F[i]为从开始到第i个时间段的收益的最大值。

    F[i]=max{F[j]}+w[i]

    j<i 且 j的结束时间+R在i的开始时间前面。

    ans=max{F[i]}

    代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    //by zrt
    //problem:
    using namespace std;
    int n,m,r;
    int f[1005];
    struct N{
        int s,e,p;
        friend bool operator < (N a,N b){
            return a.e<b.e;
        }
    }a[1005];
    int inf=1<<30;
    int main(){
        #ifdef LOCAL
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
        #endif
        scanf("%d%d%d",&n,&m,&r);
        for(int i=1;i<=m;i++){
            scanf("%d%d%d",&a[i].s,&a[i].e,&a[i].p);
        }
        a[0].e=-inf;
        sort(a,a+1+m);
        int ans=0;
        for(int i=1;i<=m;i++){
            for(int j=0;j<i;j++){
                if(a[j].e+r<=a[i].s){
                    f[i]=max(f[i],f[j]+a[i].p);
                }
            }
            ans=max(ans,f[i]);
        }
         
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    [论文收集]Web service security (尤其是RBAC)相关的论文 [更新中]
    [文章摘录] The Case for Cloud Computing (ITPro, 2009)
    [文章摘录] 网络计算系统的分类研究 (计算机学报, 2008)
    文献综述的写法
    [转]VS2005常用快捷键大全
    什么是存储过程
    使用冒泡法对数组排序
    ASP.NET中使用Global.asax文件
    轻松掌握Ajax.net系列教程
    客户端回调实现gridView无刷新分页
  • 原文地址:https://www.cnblogs.com/zrts/p/bzoj1642.html
Copyright © 2011-2022 走看看