日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

巧克力棒

發布時間:2025/3/15 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 巧克力棒 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

巧克力棒(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

總結

以上是生活随笔為你收集整理的巧克力棒的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。