description
假設有m本書(編號為1,2,…m),想將每本複製乙份,m本書的頁數可能不同(分別是p1,p2,…pm)。
將這m本書分給k個抄寫員(k<=m〉,每本書只能分配給乙個抄寫員進行複製,而每個抄寫員所分配到的書必須是連續順序的。試找乙個最優分配方案,使分配給每乙個抄寫員的頁數的最大值盡可能小(如存在多個最優方案,只輸出其中一種)。
input
檔案的第一行是兩個整數m和k (1<=k<=m<=500)。
第二行有m個整數p1,p2,…,pm,這m個整數均為正整數且都不超過1000000。每兩個整數之間用空格分開。
output
檔案有k行,每行有兩個正整數。整數之間用空格分開。
第i行的兩個整數ai和bi,表示第i號抄寫員所分配得到的書稿的起始編號與終止編號。
sample input
9 31 2 3 4 5 6 7 8 9
sample output
1 56 78 9
解題思路:
f[k,m]表示前m本書交給k個人抄寫需要的最短時間,狀態轉移方程為:
f[k,m]=min,i=1,2,…,m-1}
然後再用貪心求出具體的分配方案。
時間複雜度:o(k*m^2)
程式:var
x,y,i,j,m,n,k,t,l:longint;
a,d:array[0..500]of longint;
f:array[0..500,0..500]of longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end;
procedure print(i,j:longint);
vart,x:longint;
begin
if j=0 then exit;
if j=1 then begin writeln(1,' ',i); exit; end;
t:=i;
x:=a[i];
while x+a[t-1]<=f[k,m] do
begin
x:=x+a[t-1];
dec(t);
end;
print(t-1,j-1);
writeln(t,' ',i);
end;
begin
readln(m,k);
fillchar(f,sizeof(f),$7f);
for j:=1 to m do
begin
read(a[j]);
d[j]:=d[j-1]+a[j];
f[1,j]:=d[j];
end;
for i:=2 to k do
for j:=1 to m do
for l:=1 to j-1 do
if max(f[i-1,l],d[j]-d[l])
print(m,k);
end.
版權屬於: chris
複製書稿(動態規劃經典題)
problem description 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的...
dp專題 複製書稿
複製書稿 題目描述 現在要把m本有順序的書分給k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,使得複製時間最短。複製時間為抄寫頁數最多的人用去的時間。輸入第一行兩個...
DP 複製書稿 book
時間限制 1000 ms 記憶體限制 65536 kb 提交數 184 通過數 78 現在要把 m本有順序的書分給 k個人複製 抄寫 每乙個人的抄寫速度都一樣,一本書不允許給兩個 或以上 的人抄寫,分給每乙個人的書,必須是連續的,比如不能把第 一 第三和第四本書給同乙個人抄寫。現在請你設計一種方案,...