題目:
輸入格式:
輸入檔案的第1行包含兩個正整數n和m,表示菜品的種數和廚師的數量。 第2行包含n個正整數,其中第i個數為pi,表示點第i種菜品的人數。 接下來有n行,每行包含m個非負整數,這n行中的第i行的第j個數為ti,j,表示第j個廚師製作第i種菜品所需的時間。 輸入檔案中每行相鄰的兩個數之間均由乙個空格隔開,行末均沒有多餘空格。
輸出格式:
輸出僅一行包含乙個整數,為總等待時間的最小值。
輸入樣例#1: 複製
3 2輸出樣例#1: 複製3 1 1
5 7
3 6
8 9
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 #include8view codeusing
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 }
洛谷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時,在並查集路徑壓縮時,同時存下樹的心態。即,在...