description
外賣店一共有n種食物,分別有1到n編號。第i種食物有固定的價錢pi和保質期si。第i種食物會在si天後過期。jyy是不會吃過期食物的。
比如jyy如果今天點了乙份保質期為1天的食物,那麼jyy必須在今天或者明天把這個食物吃掉,否則這個食物就再也不能吃了。保質期可以為0天,這樣這份食物就必須在購買當天吃掉。
jyy現在有m塊錢,每一次叫外賣需要額外付給送外賣小哥外送費f元。
送外賣的小哥身強力壯,可以瞬間給jyy帶來任意多份食物。jyy想知道,在滿足每天都能吃到至少一頓沒過期的外賣的情況下,他可以最多宅多少天呢?
input
第一行包含三個整數m,f和n。
接下來n行,第i行包含兩個整數pi和si。
output
輸出僅包含一行乙個整數表示jyy可以宅的最多的天數。
sample input
32 5 2
5 010 2
sample output
data constraint
樣例說明:
jyy的最佳策略是:
第一天買乙份食物1和乙份食物2並且吃乙份食物1;
第二天吃乙份食物2;
第三天買乙份食物1並且吃掉。
自從迷上了拼圖,jyy就變成了個徹底的宅男。為了解決溫飽問題,jyy不得不依靠叫外賣來維持生計。
賽時比賽沒有什麼腦子,一直在想dp。
想了半天的收穫就是想到了可以把沒用的食物用dp去掉。
後來發現似乎可以二分答案,瞎猜了個結論是考慮平均分配錢去買食物。
那就開打。打完,發現對拍怎麼拍也拍不過。
調了好久。心態崩了,看到時間不太夠,交了個30分上去滾粗。
題解現在才發現我是真的蠢。
60分思路大概:考慮列舉購買次數,然後二分答案。二分的時候直接判斷即可。
具體判斷則是:
由於知道購買次數,然後平均分配一下m,然後暴力跑即可。
然鵝我沒有分配剩下的錢!!!
100分就是60分瞎優化一下就好了。
我們發現,二分是騙小孩的,如果知道購買次數是可以利用平均分配的思想求出最大答案的。
其實是分三步:
1、平均分配,蘋 鈞 煮 翼然後求出分配的最大天數。
2、求出天數之後就可以知道剩下的錢是多少了。
3、剩下的錢可以繼續跟在某次購買後購買物品。
這樣就最大化ans了。
然後,我們只需要求這個奇妙的購買次數即可。
由於我們發現,購買次數和ans所形成的影象是乙個上凸的影象(感性理解)
然後就三分即可。
**
#include
#include
#include
#include
#include
using namespace std;
const
int maxn=
1000001
;long
long m,ff,v[maxn]
,d[maxn]
,f[maxn]
,g[maxn]
,z[maxn]
;int n,gs;
long
long
getday
(long
long mo)
else
}return ans;
}long
long
getleft
(long
long da)
else
}return ans;
}long
long
check
(long
long x)
}return ans;
}int
main()
for(
int i=
1;i<=n;i++)}
}long
long l=1;
gs=0;
while
(l<=n)
l=1;long
long r=m/ff;
while
(l+5
<=r)
long
long ans=0;
for(
long
long i=l;i<=r;i++
)printf
("%lld\n"
,ans)
;}
JZOJ3864 JSOI2014 歌劇表演
我們想想乙個人在什麼情況下會被發現 我們給每個數標上乙個識別號,相同的識別號代表這兩個數性質相同無法識別,而當乙個數擁有乙個唯一的識別號時,該數就可以被識別。為了不讓識別號混亂,又要讓區間的數的識別號的相對位置不變,我們每次取1 n中的最大值t,每次區間中若遇到乙個新出現的識別號,我們就用t 1給它...
JSOI2015 JZOJ 4063 非誠勿擾
對於每個女性,開乙個vector記錄可選的男性 掃一遍,可以o 1 算出該女性選擇第i個男性的期望 推推公式發現是等比數列 有了這個就好辦啦,按女性為第一關鍵字男性第二關鍵字排個序,用樹狀陣列記錄下前面的女性選擇比當前大的男性的概率和 o nlogn 在算期望時涉及除法運算,精度誤差較大,所以要開l...
JZOJ3861 JSOI2014 支線劇情2
這是一道樹形dp的題。雖然我到死也沒想出來 我們設出f x 0.1 f x 0 表示當前以x為根的子樹全不放存檔點的代價。f x 1 表示當前以x為根的子樹放了存檔點的代價。f x 0 的轉移顯然,我們來想想怎麼轉移f x 1 以x為根的子樹若放了存檔點,有3種情況 1 當前的x的直接兒子y,假如它...