巧克力棒
巧克力棒(chocolate)
Time Limit:1000ms Memory Limit:64MB
【題目描述】
LYK 找到了一根巧克力棒,但是這根巧克力棒太長(zhǎng)了,LYK 無(wú)法一口吞進(jìn)去。具體地,這根巧克力棒長(zhǎng)為 n,它想將這根巧克力棒折成 n 段長(zhǎng)為 1 的巧克力棒,然后慢慢享用。它打算每次將一根長(zhǎng)為 k 的巧克力棒折成兩段長(zhǎng)為 a 和 b 的巧克力棒,此時(shí)若 a=b,則LYK 覺(jué)得它完成了一件非常困難的事,并會(huì)得到 1 點(diǎn)成就感。LYK 想知道一根長(zhǎng)度為 n 的巧克力棒能使它得到最多幾點(diǎn)成就感。
【輸入格式】(chocolate.in)
第一行一個(gè)數(shù) n。
【輸出格式】(chocolate.out)
一個(gè)數(shù)表示答案。
【輸入樣例】
7
【輸出樣例】
4
【數(shù)據(jù)范圍】
對(duì)于 20%的數(shù)據(jù) n<=5。
對(duì)于 50%的數(shù)據(jù) n<=20。
對(duì)于 80%的數(shù)據(jù) n<=2000。
對(duì)于 100%的數(shù)據(jù) n<=1000000000。
【樣例解釋】
將 7 掰成 3+4, 將 3 掰成 1+2, 將 4 掰成 2+2 獲得 1 點(diǎn)成就感, 將剩下的所有 2 掰成 1+1獲得 3 點(diǎn)成就感。總共 4 點(diǎn)成就感。
【題目分析】
可以發(fā)現(xiàn),如果巧克力棒的長(zhǎng)度為2^x的話,那他將獲得2^x-1點(diǎn)成就感(這個(gè)很容易證明,因?yàn)槟忝恳淮握鄱紩?huì)增加成就感,需要折2^x-1次)。那么問(wèn)題來(lái)了,如果他給出的長(zhǎng)度不恰好為2^x怎么辦,因?yàn)閱?wèn)題是要求出最大成就感,那我們就找到最大的x使得2^x剛好小于或等于給出的這個(gè)長(zhǎng)度(剛好就是說(shuō)2^(x+1)就會(huì)大于長(zhǎng)度),然后繼續(xù)找出剩下的那段的最大加到答案里,就不停找不停找....復(fù)雜度的話我算不出來(lái),總之不會(huì)超時(shí)
#include <cstdio> #include <cstring> #include <iostream> using namespace std; int a[35]; int ans; int n; int solve(int pos,int s) {int i;if(s==1||s==0) return 0;for(i=pos;i>=0;i--)if(s>=a[i])break;return a[i]-1+solve(i,s-a[i]); }int main() {freopen("chocolate.in","r",stdin);freopen("chocolate.out","w",stdout);a[0]=1;for(int i=1;i<=30;i++)a[i]=a[i-1]*2;scanf("%d",&n);int xx=1;for(int i=0;i<=n;i++){if(xx>=n){ans=solve(i,n);break;}xx*=2;}printf("%d",ans);fclose(stdin);fclose(stdout); }?
轉(zhuǎn)載于:https://www.cnblogs.com/xiaoningmeng/p/6039004.html
總結(jié)
- 上一篇: 性能测试—前端性能1
- 下一篇: hdu 3449 有依赖性的01背包