乙個餐廳在相繼的 nn 天裡,每天需用的餐巾數不盡相同。假設第 ii 天需要 r_iri塊餐巾( i=1,2,...,n)。餐廳可以購買新的餐巾,每塊餐巾的費用為 pp 分;或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分;或者送到慢洗部,洗一塊需 nn 天(n>mn>m),其費用為 ss 分(ss
每天結束時,餐廳必須決定將多少塊髒的餐巾送到快洗部,多少塊餐巾送到慢洗部,以及多少塊儲存起來延期送洗。但是每天洗好的餐巾和購買的新餐巾數之和,要滿足當天的需求量。
試設計乙個演算法為餐廳合理地安排好 nn 天中餐巾使用計畫,使總的花費最小。程式設計找出乙個最佳餐巾使用計畫。
由標準輸入提供輸入資料。檔案第 1 行有 1 個正整數 nn,代表要安排餐巾使用計畫的天數。
接下來的一行是餐廳在相繼的 nn 天裡,每天需用的餐巾數。
最後一行包含5個正整數p,m,f,n,sp,m,f,n,s。pp 是每塊新餐巾的費用; mm 是快洗部洗一塊餐巾需用天數; ff 是快洗部洗一塊餐巾需要的費用; nn 是慢洗部洗一塊餐巾需用天數; ss 是慢洗部洗一塊餐巾需要的費用。
將餐廳在相繼的 n 天裡使用餐巾的最小總花費輸出
輸入 #1複製
31 7 5
11 2 2 3 1
輸出 #1複製
134n<=2000
ri<=10000000
p,f,s<=10000
時限4s
思路
如何建圖:
首先,因為有兩類狀態——乾淨和髒毛巾,考慮把日期拆成毛巾的使用量和需求量。
如果用最樸素的建圖方法:
會發現,每天的髒毛巾是可以存起來等到下一次一起洗,就會導致乙個問題,容量 a [ i ] 的限制會導致最後取到的不是所有毛巾的總花費。
如何讓每條毛巾的花費都被算上,就要考慮怎樣跑滿最大流的問題。
顯然我們可以針對上圖的缺點來重新考慮建圖:
如此一來,就滿足了基本的條件:髒毛巾留到下一天的髒毛巾,髒毛巾送去洗,購置新毛巾,同時由於兩種量之間的關係不再是線性轉移,保證了能跑滿最大流。
然後上 zkw 跑 mcmf即可。
code
#include
<
bits/stdc++.h
>
using
namespace std;
#define
intlong
long
template
<
class t>
inline
void
read(t &
res)
const
int maxn =2e
3+5;
const
int inf =
0x3f3f3f3f
;int n;
struct edge
};edge *
head
[maxn <<1];
void
buildgraph(
intu
,intv,
intw
,intc)
namespace zkw}}
}return
dis[t]
}int
dfs(
intu
,int
flow
)int used =0;
vis[u]
=true
;for
(edge *e =
head
[u]; e; e =
e->
next)if
(used == flow)
break;}}
return used;
}void
work()}}
}signed
main()
int p, m, f, n, s;
read(p);
read(m);
read(f);
read(n);
read(s);
for(
int i =
1; i <= n;
++i )
zkw ::
work();
cout <
return0;
}
網路流24題 餐巾計畫(費用流)
乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i天需要 ri 塊餐巾。餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天,其費用為 s 分 s f 每天結束時,餐廳必須決定將多少塊髒的餐巾送到快...
網路流24題 餐巾計畫問題
傳送門 這個題我一開始沒把tot賦值成 1,然後調了1h。然後只拿了20,看了題解才知道漏了一種情況,那就是其實餐巾是可以留到第二天的。然後就沒了。對了,忘說做法了 尷尬 其實就是拆點,分別連邊,實現題目中的三種操作,具體可以看我的 include include include include i...
網路流24題餐巾計畫問題
乙個餐廳在相繼的 n n 天裡,每天需用的餐巾數不盡相同。假設第 i role presentation i i天需要 ri r i塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 p p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n r...