洛谷 P1654 產品排序(sort)(dp)

2021-09-30 14:15:16 字數 2241 閱讀 1742

題目描述

有一系列產品,給定每個產品的加工時間和冷卻成型時間(冷卻過程產品之間沒有關係,是單獨冷卻的)。現在你手上有兩台機器可以用來加工,你需要安排產品加工的順序以及去哪台機器加工,使得所有產品都成型的時間最早。機器之間互不相關,可以同時進行工作,乙個機器乙個時刻只能加工乙個產品。

輸入輸出格式

輸入格式:

第一行乙個數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 輸出格式 只有一行,包含乙個數,表示最少的交換次數。輸入...