題目描述
有一系列產品,給定每個產品的加工時間和冷卻成型時間(冷卻過程產品之間沒有關係,是單獨冷卻的)。現在你手上有兩台機器可以用來加工,你需要安排產品加工的順序以及去哪台機器加工,使得所有產品都成型的時間最早。機器之間互不相關,可以同時進行工作,乙個機器乙個時刻只能加工乙個產品。
輸入輸出格式
輸入格式:
第一行乙個數n,表示產品個數,以下n行,每行兩個數分別表示產品加工的時間a[i]和冷卻時間b[i]。
【資料規模】
對於20%的資料,滿足n≤6;
對於100%的資料,滿足n,a[i],b[i]≤200。
輸出格式:
乙個數表示所有產品成型的最早時間。
輸入輸出樣例
輸入樣例#1:
3 1 4
3 3
4 1
輸出樣例#1:
6本題可以用根據冷卻時間的順序先進行一步貪心,再dp,保證得到最優值
f[i,j]代表共加工了前i個產品,1號機器加工使用j單位時間,得到的最小完成時間
狀態轉移方程f[i,j]:=max c代表前i個產品的總加工時間 當然還要注意判斷能否取到j-a[i]和c[i]-j
pascal**如下
program df;
var i,j,n,m,x,y,z,k,t:longint;
a,b,c:array[0..100000] of longint;
f:array[0..200,0..40000] of longint;
procedure sq(l,r:longint);
var i,j,mm,m2,dd:longint;
begin
i:=l; j:=r;
mm:=b[(l+r) div 2];
m2:=a[(l+r) div 2];
repeat
while (b[i]>mm) or ((b[i]=mm) and (a[i]>m2)) do inc(i);
while (mm>b[j]) or ((b[j]=mm) and (m2>a[j])) do dec(j);
if i<=j then
begin
dd:=a[i]; a[i]:=a[j]; a[j]:=dd;
dd:=b[i]; b[i]:=b[j]; b[j]:=dd;
inc(i); dec(j);
end;
until i>j;
if j>l then sq(l,j);
if r>i then sq(i,r);
end;
function min(x,y:longint):longint;
begin
if x>y then exit(y)
else exit(x);
end;
begin
fillchar(f,sizeof(f),$7f);
readln(n);
for i:=1 to n do
readln(a[i],b[i]);
f[0,0]:=0;
sq(1,n); //雙關鍵字排序,b[i]從大到小,a[i] 從小到大
for i:=1 to n do
c[i]:=c[i-1]+a[i];
for i:=1 to n do
for j:=0 to c[i] do //前i個產品加工最多消耗的時間
begin
if j>=a[i] then
begin
if j+b[i]>f[i-1,j-a[i]] then z:=j+b[i] else z:=f[i-1,j-a[i]]; //第i個產品給一號機器加工
f[i,j]:=min(f[i,j],z);
end;
if c[i]-j>=a[i] then //從c[i]-j表示前i個產品給二號機器加工能用的時間
begin
if c[i]-j+b[i]>f[i-1,j] then z:=c[i]-j+b[i] else z:=f[i-1,j]; //第i個產品給二號機器加工
f[i,j]:=min(f[i,j],z);
end;
end;
z:=maxlongint;
for i:=0 to c[n] do
if z>f[n,i] then z:=f[n,i];
writeln(z);
end.
洛谷 P1654 OSU 解題報告
osu 是一款群眾喜聞樂見的休閒軟體。我們可以把osu的規則簡化與改編成以下的樣子 一共有 n 次操作,每次操作只有成功與失敗之分,成功對應 1 失敗對應 0 n 次操作對應為 1 個長度為 n 的 01 串。在這個串中連續的 x 個 1 可以貢獻 x 3 的分數,這 x 個 1 不能被其他連續的 ...
洛谷p1233 sort 貪心
題目描述 一堆木頭棍子共有n根,每根棍子的長度和寬度都是已知的。棍子可以被一台機器乙個接乙個地加工。機器處理一根棍子之前需要準備時間。準備時間是這樣定義的 第一根棍子的準備時間為1分鐘 如果剛處理完長度為l,寬度為w的棍子,那麼如果下乙個棍子長度為li,寬度為wi,並且滿足l li,w wi,這個棍...
洛谷 P1327 數列排序
給定乙個數列,這個數列滿足ai aj i j 現在要求你把這個數列從小到大排序,每次允許你交換其中任意一對數,請問最少需要幾次交換?輸入格式 第一行,正整數n n 100,000 以下若干行,一共n個數,用空格分隔開,表示數列,任意 2 31 輸出格式 只有一行,包含乙個數,表示最少的交換次數。輸入...