洛谷P2050 NOI2012 美食節

2022-05-31 04:36:11 字數 2922 閱讀 6980

題目:

輸入格式:

輸入檔案的第1行包含兩個正整數n和m,表示菜品的種數和廚師的數量。 第2行包含n個正整數,其中第i個數為pi,表示點第i種菜品的人數。 接下來有n行,每行包含m個非負整數,這n行中的第i行的第j個數為ti,j,表示第j個廚師製作第i種菜品所需的時間。 輸入檔案中每行相鄰的兩個數之間均由乙個空格隔開,行末均沒有多餘空格。

輸出格式:

輸出僅一行包含乙個整數,為總等待時間的最小值。

輸入樣例#1: 複製

3 2 

3 1 1

5 7

3 6

8 9

輸出樣例#1: 複製

47
廚師1先製作1份菜品2,再製作2份菜品1。點這3道菜的3個同學的等待時間分別為3,3+5=8,3+5+5=13。

廚師2先製作1份菜品1,再製作1份菜品3。點這2道菜的2個同學的等待時間分別為7,7+9=16。

總等待時間為3+8+13+7+16=47。

雖然菜品1和菜品3由廚師1製作更快,如果這些菜品都由廚師1製作,總等待時間反而更長。如果按上述的做法,將1份菜品1和1份菜品3調整到廚師2製作,這樣廚師2不會閒著,總等待時間更短。

可以證明,沒有更優的點餐方案。 每組資料的n、m和p值如下:

測試點編號nm

p1n = 5

m = 5

p = 10

2n = 40

m = 1

p = 400

3n = 40

m = 2

p = 300

4n = 40

m = 40

p = 40

5n = 5

m = 40

p = 100

6n = 10

m = 50

p = 200

7n = 20

m = 60

p = 400

8n = 40

m = 80

p = 600

9n = 40

m = 100

p = 800

10n = 40

m = 100

p = 800

對於100%的資料,n <= 40, m <= 100, p <= 800, ti,j <= 1000 (其中p = ∑pi)

這道題有沒有一種熟悉的感覺。。。

好吧,在做這道題之前請先去a了這道題練練手吧

p2053 [scoi2007]修車

厚顏無恥推薦另一篇我的部落格

好了,做過修車的話建圖方式一般都明白了。

問題是:這個資料範圍有點恐怖。。。。。。

所以我們要用到乙個鬼畜操作叫做動態加邊。

我們先把每個廚師做最後一道菜這種情況和菜相連,

每一次做菜後,做菜的廚師和所有菜再連一條邊就行了。

這樣就減少了很多加邊。

這樣合理的原因?盡量少嘛,你能放在倒數第一位肯定不放倒數第二位啊。

然後這道題就這樣被卡過去了。

(網路流真神奇)

建邊方法學習了hzwer dalao的(我的太難看了就不放了)

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8

using

namespace

std;

9const

int maxn=100010;10

const

int inf=2147483647;11

struct

line;

15 vectoredge;

16 vectorg[maxn];

17int

n,m,s,t;

18int

p[maxn],tot;

19int t[110][50

];20

inta[maxn],dis[maxn];

21bool

vis[maxn];

22int

pre[maxn];

23void addedge(int

from,int to,int cap,int

cost));

25 edge.push_back((line));

26int m=edge.size();

27 g[from].push_back(m-2

);28 g[to].push_back(m-1

);29}30

int spfa(int &minc)48}

49}50}

51if (dis[t]==dis[maxn-1]) return

false

;52 minc+=a[t]*dis[t];

53int u=t,aa,bb;

54while (u!=s)

59 edge[pre[u]].flow+=a[t];

60 edge[pre[u]^1].flow-=a[t];

61 u=edge[pre[u]].from;62

}63for (int i=1;i<=m;++i)

66return

true;67

}68intmcmf()

73int

main()

79 s=0; t=n*tot+m+1;80

for (int i=1;i<=m;++i)84}

85for (int i=1;i<=m;++i)

88for (int i=1;i<=n*tot;++i)

91for (int i=1;i<=n;++i)95}

96 printf("%d"

,mcmf());

97return0;

98 }

view code

洛谷P2050 美食節

修車加強版。發現每個廚師拆成p個點太浪費了,畢竟總共用到的才p個點。於是從下往上乙個乙個加,加到滿流就停。論動態加點費用流的正確姿勢.我自己加總是出現負環.我是每次加一整層,然後跑完這一層再加下一層,這樣會顯而易見的出現負環.然後我們發現如果每增廣一流量就加邊就不會出現這種毒瘤現象,因為每次加的一定...

洛谷P2044 NOI2012 隨機數生成器

數列 x ax n c bmod m 其中 a,c 是給定的常數,n 0 x 0 的值已給出。然後呢,你需要求出 x n bmod g n,m,a,c,x 0 leq10 g leq 10 8 構造列向量 c n begin1 x n end 然後,構造轉移矩陣 begin1 0 c a endc ...

洛谷 P4768 NOI2018 歸程

題目 歸程 歸程 思路 1 一種海拔 30 求最短路。詢問時,海拔 0,輸出0 否則輸出dist v 2 鏈 15 離散化。預處理出不同海拔 每個點開始到起點的答案,查表輸出。3 樹 10 樹上倍增。4 kruskal重構樹 樹上倍增。做kruskal時,在並查集路徑壓縮時,同時存下樹的心態。即,在...