BZOJ 3874 Ahoi2014 宅男計畫

2021-07-02 13:04:43 字數 1452 閱讀 1498

題意:外賣店一共有n種食物,分別有1到n編號。第i種食物有固定的價錢pi和保質期si。第i種食物會在si天後過期。jyy是不會吃過期食物的。比如jyy如果今天點了乙份保質期為1天的食物,那麼jyy必須在今天或者明天把這個食物吃掉,否則這個食物就再也不能吃了。保質期可以為0天,這樣這份食物就必須在購買當天吃掉。jyy現在有m塊錢,每一次叫外賣需要額外付給送外賣小哥外送費f元。送外賣的小哥身強力壯,可以瞬間給jyy帶來任意多份食物。jyy想知道,在滿足每天都能吃到至少一頓沒過期的外賣的情況下,他可以最多宅多少天呢?

看了wnjxyk的題解,感覺太強了。這題如果dp可以做到60分,但m達到10^18就處理不了了。首先有乙個貪心,對於食物i,j,如果si>=sj,pi<=pj,那麼j顯然無用,刪去。接下來按照保質期排序,根據我們前面的操作,現在一定是保質期越小**越低,所以從保質期小的開始取,能多買則多買,這樣一定是最優的。但現在還有乙個問題,可以買多次,但題目買的次數和生存天數之間有二次函式的關係(別問我,我也不知道怎麼證),所以三分買的次數,計算答案。

tips:1、因為可以買多次,貪心的時候要注意可能有食物在一些次數中可以買,另一些不能買(花費除以次數***可能有剩餘),但這種情況只會出現在最後一種購買的食物中,所以要特別判斷一下。

2、到處開long long(我查了好久)

#include

#include

#include

#include

using

namespace

std;

const

int maxn=200+10;

long

long m,f;

int n,del[maxn],tot;

struct node

a[maxn],hm[maxn];

int cmp(node a,node b)

if(a[i].s>=day)

} return res;

}int main()

} for(int i=1;i<=n;i++)

if(!del[i])

n=tot;

sort(a+1,a+n+1,cmp1);

long

long l=1,r=m/(f+mini);

while(l+25

long

long x1=l+(r-l)/3;

long

long x2=l+(r-l)*(long

long)2/(long

long)3;

if(calc(x1)else r=x2;

} long

long res=calc(l);

for(long

long i=l+1;i<=r;i++)

res=max(calc(i),res);

printf("%lld\n",res);

return

0;}

bzoj 3874 Ahoi2014 宅男計畫

故事背景 自從迷上了拼圖,jyy就變成了個徹底的宅男。為了解決溫飽問題,jyy 不得不依靠叫外賣來維持生計。問題描述 外賣店一共有n種食物,分別有1到n編號。第i種食物有固定的價錢pi和保質期si。第i種食物會在si天後過期。jyy是不會吃過期食物的。比如jyy如果今天點了乙份保質期為1天的食物,那...

bzoj 3874 Ahoi2014 宅男計畫

看到這一題題面,莫名想到了 蔬菜 於是莫名開始恐慌。考場上只知道有個貪心計算快遞小哥來一次,我要買能活n天的最小花費,卻沒想到還有乙個三分法來列舉快遞小哥來的次數!首先我們可以腦補一下,快遞小哥來的次數,和宅男活的總天數是成乙個二次函式關係的。就像快遞小哥來的次數少,那宅男多數的錢只能分到這麼少的購...

bzoj 3875 Ahoi2014 騎士遊戲

故事背景 長期的宅男生活中,jyy又挖掘出了一款rpg遊戲。在這個遊戲中jyy會 扮演乙個英勇的騎士,用他手中的長劍去殺死入侵村莊的怪獸。問題描述 在這個遊戲中,jyy一共有兩種攻擊方式,一種是普通攻擊,一種是法術攻 擊。兩種攻擊方式都會消耗jyy一些體力。採用普通攻擊進攻怪獸並不能把怪獸徹底殺死,...