Luogu P1248 加工生產排程 題解報告

2022-04-28 20:21:09 字數 2176 閱讀 5381

題目傳送門

【題目大意】

有$n$個任務要在兩個流水線上完成,第$i$個任務在第乙個流水線上需要$a_i$的時間完成,在第二個流水線上需要$b_i$的時間完成。每個任務要現在第乙個流水線上完成之後才可以到第二個流水線上開始工作,求如何安排可以使得總時間最短。

【思路分析】

這個題目直接看好像有點複雜?我們先來想一下另乙個簡單一點的題目。

現在有$n$個小怪獸要打,你初始血量為$m$,打第$i$個小怪獸要消耗$a_i$點血,打死這個小怪獸後可以加$b_i$點血,求如何安排打小怪獸的順序可以使得需要的初始血量$m$最少?

你需要保證在打小怪獸的過程中任意時刻血量大於0,所以首先可以想到乙個很顯然的貪心策略:

如果$b_i>a_i$,那麼我肯定先打這個小怪獸,因為它總體是給我加血的。然後對於同樣可以加血的小怪獸,我們把$a$小的排在前面顯然是更優的。因為先少扣一點血,後面加了血之後血多了再多扣一點,這樣可以使得需要的初始血量更少。

如果$b_i\le a_i$,那麼我肯定後打這個小怪獸,因為它總體是給我扣血的,我前面加了一些血之後再扣血,需要的初始血量小一些,所以這樣更優。然後我們可以把$a,b$換過來考慮,即把$a$看作$b$,把$b$看作$a$,那麼就是上面提到的這種情況,我們把$b$從小到大排序(倒序是從小到大,正序就是從大到小)是最優的。

然後我們現在回到原來這道題。可以這麼理解:

我完成乙個任務要先浪費$a_i$的時間,然後可以補回$b_i$的時間,最後的答案=$\sum_^b_i$+浪費掉的總時間。為了保證在完成任務的過程中每個任務都是先在第乙個流水線上完成後再到第二個流水線上去,我們需要預留一些時間用來被浪費掉(emmmm這句話看起來有點蠢?qaq),也就是要保證任意時刻都有時間可以浪費(相當於上面說道的血量大於0,即還有血可以被扣),那麼顯然可以參照上面的思路來做。

【**實現】

1 #include2 #include3 #include4 #include5 #include6

#define g() getchar()

7#define rg register

8#define go(i,a,b) for(rg int i=a;i<=b;i++)

9#define back(i,a,b) for(rg int i=a;i>=b;i--)

10#define db double

11#define ll long long

12#define il inline

13#define pf printf

14using

namespace

std;

15int

fr()

22while(ch>='

0'&&ch<='

9') w=(w<<1)+(w<<3)+ch-'

0',ch=g();

23return w*q;24}

25const

int n=1002;26

intn,ans,num1,num2,a[n],b[n],sum;

27struct

wkw1[n],w2[n];

30 il bool cmp(wk x,wk y)

31 il bool cmq(wk x,wk y)

32int

main();

40else w2[++num2]=(wk);41}

42 sort(w1+1,w1+1+num1,cmp);sort(w2+1,w2+1+num2,cmq);

43 rg int

as=0;//

記錄整個過程中時間的變化

44 go(i,1

,num1)

49 go(i,1

,num2)

54 pf("

%d\n

",ans+sum);

55 go(i,1,num1) pf("

%d "

,w1[i].id);

56 go(i,1,num2) pf("

%d "

,w2[i].id);

57 puts(""

);58

return0;

59 }

**戳這裡

Luogu P1248 加工生產排程

題目鏈結 這個題可以貪心 我們首先想 對於所有產品,我們大致可以將其分為三類 在a車間的時間要比b車間長。兩者一樣。在b車間的時間要比a車間長。對於這三大類,怎麼安排順序?可以看出,類是消耗b車間任務,類是給b車間增加任務。我們想,要想時間最快,必須要盡可能的讓ab兩車間沒有空閒的工作。如果我們將 ...

題解 模板 P1248 加工生產排程 貪心

分析 性質 對於乙個 a,b 若 a ge b 不如在後面做這些東西,不然會讓 b 空轉。然後排序 模擬就寫完了,其實這道題很難,不過分析一波性質後就很簡單。我很慚愧地將若非看了題解不然想不到啊.winlere include include include include includeusing...

加工生產排程

題目描述 某工廠收到了n個產品的訂單,這n個產品分別在a b兩個車間加工,並且必須先在a車間加工後才可以到b車間加工。某個產品i在a b兩車間加工的時間分別為ai bi。詢問怎樣安排這n個產品的加工順序,才能使總的加工時間最短。這裡所說的加工時間是指 從開始加工第乙個產品到最後所有的產品都已在a b...