宅男計畫 單峰函式三分

2022-02-18 15:50:49 字數 1974 閱讀 3115

description

自從迷上了拼圖,jyy 就變成了個徹底的宅男。為了解決溫飽問題,jyy 不得不依靠叫外賣來維持生計。

外賣店一共有n種食物,分別由1到n編號。第i種食物有固定的價錢pi和保質期si。第i種食物會在si天後過期。jyy 是不會吃過期食物的。比如 jyy 如果今天點了乙份保質期為0天的食物,那麼 jyy 必須在今天或者明天把這個食物吃掉,否則這個食物就再也不能吃了。保質期可以為

天,這樣這份食物就必須在購買當天吃掉。

jyy 現在有m塊錢,每一次叫外賣需要額外付給送外賣小哥外送費f

元。送外賣的小哥身強力壯,可以瞬間給 jyy 帶來任意多份食物。

jyy 想知道,在滿足每天都能吃到至少一頓沒過期的外賣的情況下,他可以最多宅多少天呢?

題目鏈結首先,這題詭異而無聊的資料範圍需要用double來計算費用,再某些特殊資料下計算資料會爆long long。

比較容易發現的就是所有的錢一部分花在了外送費上,另一部分才是買外賣的。

那麼如果我們已經確定了我們要點多少次外賣,然後就可以採取最優決策了。

點外賣的次數太多不好,把太多的錢花費在小費上了。

點外賣的次數太少也不好,那樣可能就會因為保質期的限制而被迫買更貴的外賣了。

奇妙的單峰函式性質。

具體為什麼能看出它是單峰函式。。emm,一是直覺,二是經驗。

看起來是對的,而且沒有反例啊,那就是對的吧。。。好的,那它就是對的。

三分的大致套路就是就是把函式劈成3個部分,取4個端點根據大小關係來縮小區間。

目前區間的端點是l,r,你要分出的兩個新端點為ml,mr。

兩種分法:ml=l+(r-l)/3;mr=l+(r-l)*2/3;或ml=l+r>>1;mr=ml+1;

本質是一樣的,後者的複雜度更低為2為底的對數,前者的底是1.5。

反正我們已經把函式搞成3段了,然後呢?

我們已經確定最大(小)值已經在[l,r]裡了,那麼只有3種情況(以求最大值為例):

1)在[l,ml]裡,那麼就有f(ml)>f(mr)>f(r)

2)在[ml,mr]裡,那麼有f(ml)>f(mr)>f(r)或f(l)3)在[mr,r]裡,那麼有f(l)所以我們可以發現如果滿足f(l)如果滿足f(ml)>f(mr)>f(r)那麼答案一定不在[mr,r]裡。

與f(l),f(r)的比較沒有意義,所以我們關注的就是f(ml),f(mr)的大小關係

根據它們的大小關係我們就可以把答案區間縮小一部分了。

為了防止區間能縮小,我們要確保區間的大小至少是4(l

1

while(l2

)6 ans=max(max(f(l),f(l+1)),f(r));

三分大致框架

那麼剩下的問題就是決策/計算了。

顯而易見,最便宜的外賣肯定是要買的,那些保質期短而**高的我們乙個也不會買。

那麼我們把外賣按**排序,**相同的只留下保質期最長的,**高保質期短的排除。

那麼我們就不斷買當前最便宜的就可以了,買的錢數是(這個保質期-上乙個的保質期)×**×點外賣次數(可能爆long long)

那麼我們在總錢數m裡先減去外送費,剩下的錢不斷採取上述決策,如果某一種不能全部賣完那麼就能買幾份買幾份。

這樣就可以計算出天數了。套個三分,搞定。

1 #include2 #include3

using

namespace

std;

4#define int long long

5struct ps

14else

return p[i-1].t*tms+lft/p[i].w;15}

16signed main()

27 printf("

%lld\n

",max(max(q(l),q(r)),l+1

<=r?q(l+1):0

));28 }

完整**811b

三分求單峰函式最值

二分可以求解單調函式最值,模擬不難想到三分可以求解單峰函式。何為單峰函式,如果函式f x 在區間 a,b 上只有唯一的最大值點 或最小值點 c,而在最大值點 或最小值點 c的左側,函式單調增加 減少 在點c的右側,函式單調減少 增加 則稱這個函式為區間 a,b 上的單峰函式 如果函式f x 在區間 ...

期末考試 單峰函式三分

description 有n位同學,每位同學都參加了全部的m 門課程的期末考試,都在焦急的等待成績的公布。第i位同學希望在第ti 天或之前得知所有課程的成績。如果在第ti 天,有至少一門課程的成績沒有公布,他就會等待最後公布成績的課程公布成績,每等待一天就會產生c 不愉快度。對於第i門課程,按照原本...

bzoj3874 宅男計畫 三分 貪心

題意 有許多種食品,每種有 保質期兩種屬性,乙個人有乙個數目的錢,求這個人可以活多久。如果資料範圍小一點那這個顯然可以 dp 然而 0 si 10 1 f,pi,m 10 1 n 200 我也很絕望啊 首先這個東西是個凸函式 為什麼?我不知道聯想生活實際 也就是存活天數是與送餐次數成凸函式 其實不是...