time limit: 10 sec memory limit: 512 mb
submit: 1304 solved: 702
[submit][status][discuss]
輸入檔案的第1行包含兩個正整數n和m,表示菜品的種數和廚師的數量。 第2行包含n個正整數,其中第i個數為pi,表示點第i種菜品的人數。 接下來有n行,每行包含m個非負整數,這n行中的第i行的第j個數為ti,j,表示第j個廚師製作第i種菜品所需的時間。 輸入檔案中每行相鄰的兩個數之間均由乙個空格隔開,行末均沒有多餘空格。
輸出僅一行包含乙個整數,為總等待時間的最小值。
3 2
3 1 1
5 7
3 6
8 947
【樣例說明】
廚師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不會閒著,總等待時間更短。
可以證明,沒有更優的點餐方案。
【資料規模及約定】
對於100%的資料,n <= 40, m <= 100, p <= 800, ti,j <= 1000(其中p = ∑pi,即點菜同學的總人數)。
每組資料的n、m和p值如下:
測試點編號 n m p
1 n = 5 m = 5 p = 10
2 n = 40 m = 1 p = 400
3 n = 40 m = 2 p = 300
4 n = 40 m = 40 p = 40
5 n = 5 m = 40 p = 100
6 n = 10 m = 50 p = 200
7 n = 20 m = 60 p = 400
8 n = 40 m = 80 p = 600
9 n = 40 m = 100 p = 800
10 n = 40 m = 100 p = 800
題解:動態建邊
**:
1 #include2 #include3 #include4 #include5 #include6#define maxn 100005
7#define t 10000189
using
namespace
std;
1011
int ans,n,tot,m,dis[maxn],head[maxn],cnt=1,c[45],t[45][105],inq[maxn],from[maxn],que[10*maxn];
1213
struct ss e[3000005
];14
15void add(int u,int v,int c,int
w)16
2425
void insert(int u,int v,int c,int
w)
2630
31bool
spfa()
3250 inq[now]=0
; 51}
52if (dis[t]==0x7fffffff) return0;
53else
return
1; 54}
5556
void
mcf()
5764}65
for (int i=from[t];i;i=from[e[i].from
])66 70
for (int i=1;i<=n;i++)
71 insert((a-1)*tot+b,m*tot+i,b*t[i][a],1
);
72}
7374
intmain()
75
BZOJ2879 美食節(費用流)
bzoj 洛谷一眼就會思路了吧。把每個廚師拆點,拆分為他最多能要做的菜的個數,即 p i pi 然後把每個菜向廚師的每個點連邊,表示這個菜是這個廚師做的第幾個菜。考慮一下這個菜放在這個位置對於後面所有位置的影響就好了。然後跑費用流就好了。經蘿蔔提醒,上面這個東西就是scoi2007修車那道題目 然而...
BZOJ 2879 美食節(費用流 動態加邊)
題意 有n道菜,每道菜需要b i 份,m個廚師,第j個廚師做第i道菜需要時間a i j 求做完所有菜,所有人等待的最小總時間。思路 設所有的菜為sum。乙個明顯的思路是將每個廚師拆成sum個點。然後sum個菜每個菜向每個廚師的每個點連邊,表示該道菜為該廚師第幾個做。由於這樣資料太大。動態加邊。每次增...
C 之路高階 bzoj2199(奶牛議會)
f.a.qs home discuss problemset status ranklist contest modifyuser gryz2016 logout 捐贈本站 notice 由於本oj建立在linux平台下,而許多題的資料在windows下製作,請注意輸入 輸出語句及資料型別及範圍,避...