[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;
}    

猜你喜欢

转载自www.cnblogs.com/Cindy-Chan/p/11272274.html
今日推荐