description
自從迷上了拼圖,jyy 就變成了個徹底的宅男。為了解決溫飽問題,jyy 不得不依靠叫外賣來維持生計。題目鏈結首先,這題詭異而無聊的資料範圍需要用double來計算費用,再某些特殊資料下計算資料會爆long long。外賣店一共有n種食物,分別由1到n編號。第i種食物有固定的價錢pi和保質期si。第i種食物會在si天後過期。jyy 是不會吃過期食物的。比如 jyy 如果今天點了乙份保質期為0天的食物,那麼 jyy 必須在今天或者明天把這個食物吃掉,否則這個食物就再也不能吃了。保質期可以為
天,這樣這份食物就必須在購買當天吃掉。
jyy 現在有m塊錢,每一次叫外賣需要額外付給送外賣小哥外送費f
元。送外賣的小哥身強力壯,可以瞬間給 jyy 帶來任意多份食物。
jyy 想知道,在滿足每天都能吃到至少一頓沒過期的外賣的情況下,他可以最多宅多少天呢?
比較容易發現的就是所有的錢一部分花在了外送費上,另一部分才是買外賣的。
那麼如果我們已經確定了我們要點多少次外賣,然後就可以採取最優決策了。
點外賣的次數太多不好,把太多的錢花費在小費上了。
點外賣的次數太少也不好,那樣可能就會因為保質期的限制而被迫買更貴的外賣了。
奇妙的單峰函式性質。
具體為什麼能看出它是單峰函式。。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完整**811busing
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 }
三分求單峰函式最值
二分可以求解單調函式最值,模擬不難想到三分可以求解單峰函式。何為單峰函式,如果函式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 我也很絕望啊 首先這個東西是個凸函式 為什麼?我不知道聯想生活實際 也就是存活天數是與送餐次數成凸函式 其實不是...