zoukankan      html  css  js  c++  java
  • POJ 3616 Milking Time

    Language:
    Milking Time
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 13855   Accepted: 5851

    Description

    Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as possible.

    Farmer John has a list of M (1 ≤ M ≤ 1,000) possibly overlapping intervals in which he is available for milking. Each interval i has a starting hour (0 ≤ starting_houri ≤ N), an ending hour (starting_houri < ending_houri ≤N), and a corresponding efficiency (1 ≤ efficiencyi ≤ 1,000,000) which indicates how many gallons of milk that he can get out of Bessie in that interval. Farmer John starts and stops milking at the beginning of the starting hour and ending hour, respectively. When being milked, Bessie must be milked through an entire interval.

    Even Bessie has her limitations, though. After being milked during any interval, she must rest R (1 ≤ R ≤ N) hours before she can start milking again. Given Farmer Johns list of intervals, determine the maximum amount of milk that Bessie can produce in the N hours.

    Input

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

    Sample Input

    12 4 2
    1 2 8
    10 12 19
    3 6 24
    7 10 31

    Sample Output

    43

    给定时间段,每个时间段有工作效率,每个时间段都要休息,求最大工作量

    跟求最大上升子序列差不多

    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    struct node{
        int s,e,ef;
        
    }x[100000];
    bool cmp(node a,node b){
        return a.e<b.e;
    }
    int dp[100000];
    int main()
    {
        int a,b,c;
        cin>>a>>b>>c;
        for(int i=1;i<=b;i++)
        {
            cin>>x[i].s>>x[i].e>>x[i].ef;
            x[i].e+=c;
        }
        sort(x+1,x+1+b,cmp);
        memset(dp,0,sizeof(dp));
        int ans=0;
        for(int i=1;i<=b;i++)
        {
            dp[i]=x[i].ef;
            for(int j=1;j<i;j++)
            {
                if(x[i].s>=x[j].e)
                {
                    dp[i]=max(dp[i],dp[j]+x[i].ef);//判断选这个或者不选这个,根据工作量大小
                }
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans;
        
    }
  • 相关阅读:
    浅谈异或运算^的作用
    牛客网剑指offer第40题——数组中只出现一次的数字(浅谈位运算的妙用)
    归并排序——一文吃透归并和递归的思想和完整过程!(没看懂请留言)
    深入分析二分查找及其变体
    vector构造函数的学习
    牛客网剑指offer第34题——找到第一个只出现一次的字符
    牛客网剑指offer第27题——求字符串的全排列
    牛客网剑指offer第20题——定义栈的数据结构
    C++重载运算简介
    Leetcode中字符串总结
  • 原文地址:https://www.cnblogs.com/wpbing/p/9508640.html
Copyright © 2011-2022 走看看