zoukankan      html  css  js  c++  java
  • [Luogu P1280]尼克的任务

    P1280 尼克的任务

    尼克的一个工作日为N分钟,从第一分钟开始到第N分钟结束。当尼克到达单位后他就开始干活。如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做,而其余的则由他的同事完成,反之如果只有一个任务,则该任务必需由尼克去完成,假如某些任务开始时刻尼克正在工作,则这些任务也由尼克的同事完成。如果某任务于第P分钟开始,持续时间为T分钟,则该任务将在第P+T-1分钟结束。

    写一个程序计算尼克应该如何选取任务,才能获得最大的空暇时间。

    分析:

    DP只考虑某一段时间内最优结果的关系,且要满足无后效性。

    我们就这道题来看,如果尼克在一个时间点上没有接到任务,我们就让他延续他原来的空闲时段,现在空闲时间=上一个空闲点的空闲时间+1;如果这时有这个时间点开始的任务,我们就将其插入,有多个这样的任务供我们选择最优的。

    假设我们从时刻0开始扫,那么假设时刻t为事件j结束时间,显然等式w[t] = max(w[t - v[j]])不成立,因为题目条件中:“如果在同一时刻有多个任务需要完成,尼克可以任选其中的一个来做。如果只有一个任务,则该任务必需由尼克去完成”。以事件结束时间推没办法满足这一条件。

    那么假如我们从时刻n开始向前扫呢?w[t] = max(w[t + v[j]])。因为一个事件开始和结束时间点空闲时间是一样的,所以在某一时刻开始的事件中,选择空闲时间最长的方案,,最后输出w[1],即可得到最优解。

    放上核心代码:

    int top = k;
    for(int i=n;i>0;i--){
        if(i == v[top].p){
            while(i == v[top].p && top >= 1)
                w[i] = max(w[i],w[i + v[top].t]),top--;
        }
        else w[i] = w[i + 1] + 1;
    }    
  • 相关阅读:
    1002. 查找常用字符『简单』
    1108. IP 地址无效化『简单』
    1137. 第 N 个泰波那契数『简单』
    1154. 一年中的第几天『简单』
    1185. 一周中的第几天『简单』
    1207. 独一无二的出现次数『简单』
    暑期集训模拟赛3
    暑期集训模拟赛2
    暑期集训模拟赛1
    CF526F Pudding Monsters 【分治】
  • 原文地址:https://www.cnblogs.com/Cindy-Chan/p/11272274.html
Copyright © 2011-2022 走看看