尼克的工作安排

来源:互联网 发布:科赫兄弟 知乎 编辑:程序博客网 时间:2024/04/30 08:46

问题描述:

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

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

解题思路:

         这是一道比较简单的动态规划问题。以样例来分析,声明F数组,F[i]表示从i分钟到最后可以休息的最大空暇时间。倒着推。显然F[15]=1。F[14]=2。……到F[11]时,因为第11分钟有任务,那么他需要去做,做到第11+5-1分钟结束。那么F[11]=F[11+5],即做完后的那一分钟。边界条件是F[N+1]=0。如果某一分钟有许多任务时,那么先假设他做了任意一个任务,然后再试试这一分钟的其他任务看是不是空闲更大。t[x]表示第x个任务用的时间。

if F[i+t[x]]>F[i] then F[i]:=F[i+t[x]]如果做第x个任务可以休息更多则做第x个任务。

代码:

代码没找到……找了一个之前写的pascal代码

var i,n,k,x:longitn;   p,t,f:array[0..10005]of longint;beginread(n,k);x:=k; fori:=1 to k do read(p[i],t[i]);for i:=n downto 1 doif i>p[x] then f[i]:=f[i+1]+1 elsebeginf[i]:=f[i+t[x]];x:=x-1;while i=p[x] dobeginif f[i+t[x]]>f[i] then f[i]:=f[i+t[x]];x:=x-1;end;end;write(f[1]);end.


0 0
原创粉丝点击