[Luogu 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; }
标签:Luogu,top,任务,P1280,时间,时刻,尼克,空闲 来源: https://www.cnblogs.com/Cindy-Chan/p/11272274.html