• POJ 3616 奶牛挤奶


    Milking Time

    贝茜是一个勤劳的牛。事实上,她如此​​专注于最大化她的生产力,于是她决定安排下一个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:

    * Line 1: Three space-separated integers: NM, 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

    Output:* Line 1: The maximum number of gallons of milk that Bessie can product in the Nhour

    题意:给了一段区间(开始,结束和价值),并给了了一个区间的间隔,求在N的时间内所能获得的最大价值;

    题解:线性DP问题,刚开始思路有点问题,想对这总时间(N)直接进行dp,但是很难判定,而且会超时

    子问题:在前i个区间内取得最大值,即对这m段的区间进行dp; 

    划分问题:前i个可以从第j个(小于i)接上,和最长上升子序列是一样的模型; 

    注意:这个输入数据对它先排个序(必须要排的,按照开始时间或者结束时间从小到大排);

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int INF=0x3f3f3f3f;
    const int maxn=1e3+5;
    
    struct NOOD{
        int s,e;
        int val;
    } nd[maxn];
    
    int f[maxn];
    
    /*       //这两种排序方式都能过,当然我更倾向于后者
    bool cmp(NOOD x, NOOD y){
        if(x.s==y.s)
            return x.e<y.e;
        return x.s<y.s;
    }
    */
    
    bool cmp(NOOD x, NOOD y)
    {
        if(x.e==y.e)
            return x.s<y.s;
        return x.e<y.e;
    }
    int main()
    {
        //freopen("in.txt", "r", stdin);
        int n, m, r;
        cin>>n>>m>>r;
        for(int i=1; i<=m; i++)
            cin>>nd[i].s>>nd[i].e>>nd[i].val;
        sort(nd+1, nd+m+1, cmp);
    
        int ans=-INF;
        for(int i=1; i<=m; i++)
        {
            f[i]=nd[i].val;
            for(int j=1; j<i; j++)
            {
                if(nd[j].e+r<=nd[i].s)
                    f[i]=max(f[i], f[j]+nd[i].val);
            }
            ans=max(ans, f[i]);
        }
        cout<<ans<<endl;
        return 0;
    }
  • 相关阅读:
    C语言宏中"#"和"##"的用法
    Ubuntu 14.04 LTS 安装和配置Bochs
    C和C++中static的比较
    总线设备驱动模型
    驱动设计的思想:面向对象/分层/分离
    基于分层思想的驱动程序软件框架
    单元测试指南
    Apollo移植
    剑指offer python版 数组中出现次数超过一半的数字
    剑指offer python版 字符串的排列
  • 原文地址:https://www.cnblogs.com/Yokel062/p/10772716.html
Copyright © 2020-2023  润新知