回 帖 发 新 帖 刷新版面

主题:帮我解一下

〖题目描述〗
假设有M本书(编号为1,2,…M),想将每本复制一份,M本书的页数可能不同(分别是P1,P2,…PM)。任务是将这M本书分给K个抄写员(K〈=M〉,每本书只能分配给一个抄写员进行复制,而每个抄写员所分配到的书必须是连续顺序的。
意思是说,存在一个连续升序数列 0 = bo < b1 < b2 < … < bk-1 < bk = m,这样,第I号抄写员得到的书稿是从bi-1+1到第bi本书。复制工作是同时开始进行的,并且每个抄写员复制的速度都是一样的。所以,复制完所有书稿所需时间取决于分配得到最多工作的那个抄写员的复制时间。试找一个最优分配方案,使分配给每一个抄写员的页数的最大值尽可能小(如存在多个最优方案,只输出其中一种)。
(GDOI''99 Books). 

回复列表 (共2个回复)

沙发

你没有打〖输入格式〗和〖输出格式〗以及〖输入输出样例〗 
这是2002年的竞赛题,可用动态规划来解决.

板凳

很明显用动态规划做
program copybooks;
   var r,l,t,i,j,k,m,n:longint;
       w:longint;
       p:array[1..100]of longint;
       f:array[1..100,1..100,1..100]of longint;
   function max(a,b:longint):longint;
        begin
          if a>=b then exit(a) else exit(b);
         end;
   begin
    readln(m,k);
    for i:=1 to m do begin read(p[i]);f[i,i,1]:=p[i];end;
    for i:=1 to m do
      for j:=i+1 to m do
         f[i,j,1]:=f[i,j-1,1]+f[j,j,1];
     for i:=2 to k do
       for j:=2 to m do
         for t:=1 to m-j+1 do
          begin
            w:=1000000;
            for l:=t to j+t-2 do
              if l-t+1<i then begin
                             for r:=1 to l-t+1 do
                                if w>max(f[t,l,r],f[l+1,j+t-1,i-r]) then w:=max(f[t,l,r],f[l+1,j+t-1,i-r]);
                              end
              else begin
                          for r:=1 to i-1 do
                                  if w>max(f[t,l,r],f[l+1,j+t-1,i-r]) then w:=max(f[t,l,r],f[l+1,j+t-1,i-r]);
                    end;
               f[t,j+t-1,i]:=w;
           end;
         writeln(f[1,m,k]);
      end.

我来回复

您尚未登录,请登录后再回复。点此登录或注册