洛谷 P1251 餐巾計畫問題 三分 貪心

2021-08-28 16:05:35 字數 2334 閱讀 4484

傳送門:洛谷 p1251

乙個餐廳在相繼的 n

nn 天裡,每天需用的餐巾數不盡相同。假設第 i

ii 天需要 r

ir_i

ri​塊餐巾(i=

1,2,

…,n)

(i=1,2, \dots ,n)

(i=1,2

,…,n

)。餐廳可以購買新的餐巾,每塊餐巾的費用為 p

pp 分;或者把舊餐巾送到快洗部,洗一塊需 m

mm 天,其費用為 f

ff 分;或者送到慢洗部,洗一塊需 n

nn 天(n

>

mn>m

n>

m),其費用為 s

ss 分(s

s每天結束時,餐廳必須決定將多少塊髒的餐巾送到快洗部,多少塊餐巾送到慢洗部,以及多少塊儲存起來延期送洗。但是每天洗好的餐巾和購買的新餐巾數之和,要滿足當天的需求量。

試設計乙個演算法為餐廳合理地安排好 n

nn 天中餐巾使用計畫,使總的花費最小。程式設計找出乙個最佳餐巾使用計畫。

未用過的餐巾

已經買了,免費

前面慢洗出來的餐巾

越早越好(留給後面的慢洗)

前面快洗出來的餐巾

越晚越好(盡可能留給慢洗)

根據題目的條件,可以保證其費用是遞增的。

至於實現,只需要記錄每一天能夠用來換洗的餐巾數即可。

三分

至於如何確定要買的餐巾數,列舉是一定okok

ok的,只不過效率太低。

我們可以猜測一下餐巾數與最小費用之間的關係,應該近似單谷函式

感性的認識:若餐巾數過小,則會無解,可視為無窮大;若餐巾數過多,則無需換洗餐巾,但換洗餐巾必定比不換洗要優。

於是,就愉快的三分吧(三分和二分差不多,隨便看看就行了)。

#include

#include

#include

#define il inline

#define ll long long

using

namespace std;

const

int maxn =

2000+5

;const ll inf =

0xfffffffffffff

;//ans比較大,注意無窮大的取值

il int

read()

int n;

int t1, t2;

ll p0, p1, p2;

int need[maxn]

, num[maxn]

;//需要的餐巾數 , 每天可換洗的餐巾數

il ll min_

(ll x, ll y)

il ll check

(ll rest)

for(

; tp < t &&

!num[tp]

;++tp)

;//算是乙個優化,找到最早的能換洗餐巾的時間

for(

int i = tp; i <= t - t2;

++i)

//慢洗,從前往後

if(num[i]

)for

(int i = t - t1; i >=

1&& i > t - t2;

--i)

//快洗, 從後往前

if(num[i])if

(ned)

return inf;

//如果能用的都用上了,但還是滿足不了條件,那就無解了

}return price;

}int

main()

、 //頭痛,解釋不了

p0 =

read()

; t1 =

read()

; p1 =

read()

; t2 =

read()

; p2 =

read()

; l = need[1]

;//標準式三分

for(ll k, lmid, rmid, s1, s2;l +

2< r;

) ll ans =

check

(l);

for(

++l;l <= r;

++l)

ans =

min_

(ans,

check

(l))

;printf

("%lld"

, ans)

;return0;

}

洛谷 P1251 餐巾計畫問題

吃什麼 先說建圖 經典構圖題。將每一天拆成兩個點i,i 加如下6條邊 s i,r i,p 在第 i 天可以買至多ri 個餐巾,每塊 p 分 i t,r i,0 第i 天要用ri 塊餐巾 s i ri,0 第 i 天用剩的ri 塊舊餐巾 i i m,f 第 i 天的舊餐巾送到快洗部,每塊 f分 i i...

洛谷 P1251餐巾計畫問題 題解

傳送門 乙個餐廳在相繼的 n 天裡,每天需用的餐巾數不盡相同。假設第 i 天需要 r i 塊餐巾 i 1,2,n 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分 或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f 分 或者送到慢洗部,洗一塊需 n 天 n m 其費用為 s 分 s 每天結束時,餐...

P1251 餐巾計畫問題

題面 一道特別棒的費用流好題,思路非常巧妙 對於每一天,我們分為早上和晚上兩個節點 每天早上會消耗 r i 條乾淨的毛巾,可以視為流向匯點,所以我們向匯點連一條流量為 r i 費用為 0 的邊 每天晚上會產生 r i 條髒毛巾,可以視為從源點流出,所以我們從源點連一條流量為 r i 費用為 0 的邊...