巧克力棒
巧克力棒(chocolate)
Time Limit:1000ms Memory Limit:64MB
【題目描述】
LYK 找到了一根巧克力棒,但是這根巧克力棒太長了,LYK 無法一口吞進去。具體地,這根巧克力棒長為 n,它想將這根巧克力棒折成 n 段長為 1 的巧克力棒,然后慢慢享用。它打算每次將一根長為 k 的巧克力棒折成兩段長為 a 和 b 的巧克力棒,此時若 a=b,則LYK 覺得它完成了一件非常困難的事,并會得到 1 點成就感。LYK 想知道一根長度為 n 的巧克力棒能使它得到最多幾點成就感。
【輸入格式】(chocolate.in)
第一行一個數 n。
【輸出格式】(chocolate.out)
一個數表示答案。
【輸入樣例】
7
【輸出樣例】
4
【數據范圍】
對于 20%的數據 n<=5。
對于 50%的數據 n<=20。
對于 80%的數據 n<=2000。
對于 100%的數據 n<=1000000000。
【樣例解釋】
將 7 掰成 3+4, 將 3 掰成 1+2, 將 4 掰成 2+2 獲得 1 點成就感, 將剩下的所有 2 掰成 1+1獲得 3 點成就感。總共 4 點成就感。
【題目分析】
可以發現,如果巧克力棒的長度為2^x的話,那他將獲得2^x-1點成就感(這個很容易證明,因為你每一次折都會增加成就感,需要折2^x-1次)。那么問題來了,如果他給出的長度不恰好為2^x怎么辦,因為問題是要求出最大成就感,那我們就找到最大的x使得2^x剛好小于或等于給出的這個長度(剛好就是說2^(x+1)就會大于長度),然后繼續找出剩下的那段的最大加到答案里,就不停找不停找....復雜度的話我算不出來,總之不會超時
#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); }?
轉載于:https://www.cnblogs.com/xiaoningmeng/p/6039004.html
總結
- 上一篇: 性能测试—前端性能1
- 下一篇: hdu 3449 有依赖性的01背包