zoukankan      html  css  js  c++  java
  • 巧克力棒&&新年的巧克力棒

    巧克力棒

    题目描述

    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-1 4-3 8-7 ......

    3-1 5-3 9-7 ......

    懂了嗎?

    代碼實現:

    1 #include<cstdio>
    2 int n,ans;
    3 int main(){
    4   scanf("%d",&n);
    5   ans=n;
    6   while(n){n-=n&(-n);ans--;}
    7   printf("%d
    ",ans);
    8   return 0;
    9 }

    题目来源:CODE[VS]

    新年的巧克力棒

    马上就要到羊年了,羊村一片欢腾,懒羊羊则懒洋洋地躺在草坪上吃新年的巧克力棒。

    他手上的巧克力棒是个由 nn 个巧克力单元格组成的长度为 nn 的长条,现在懒羊羊想把巧克力棒掰开成一个个小单元格。

    初始时懒羊羊会把这根巧克力棒丢在草坪上,然后每次懒羊羊会从草坪上拿起一根长度大于 11 的巧克力棒,然后从某两个相邻的单元格的间隙处掰开变成两根巧克力棒,然后把这两根巧克力棒丢在草坪上。懒羊羊初始愉悦值为 00,每次掰开巧克力棒后如果这两根巧克力棒长度相等,那么懒羊羊将提升 11 点愉悦值。

    当然,草坪上全是长度为 11 的巧克力棒时懒羊羊就会停止操作。现在懒羊羊想知道,他能获得的愉悦值最多是多少?

    输入格式

    一行一个正整数 TT。

    接下来 TT 行,每行一个正整数 nn 表示巧克力棒的长度,你需要对每个给出的 nn 计算最多能获得的愉悦值。

    输出格式

    TT 行每行一个整数,表示懒羊羊最多能获得的愉悦值。

    样例一

    input

    5
    1
    3
    4
    7
    233333333
    
    

    output

    0
    1
    3
    4
    233333319
    
    

    explanation

    对于 n=1n=1,初始时草坪上已经全是长度为 11 的了,所以愉悦值为 00。

    对于 n=3n=3,懒羊羊可以先把它掰开变成一根长度为 11 的和一根长度为 22 的巧克力棒;然后再把长度为 22 的巧克力棒从正中间掰开获得 11 点愉悦值,所以答案是 11。

    对于 n=4n=4,懒羊羊可以先从正中间掰开变成两根长度为 22 的巧克力棒,获得 11 点愉悦值;然后再对于每根长度为 22 的巧克力棒从正中间掰开各获得 11 点愉悦值,所以答案是 33。

    限制与约定

    对于所有数据,T20T≤20。

    测试点编号nn 的规模
    1 n5n≤5
    2 n20n≤20
    3 n1000n≤1000
    4
    5
    6 n109n≤109
    7
    8
    9
    10

    时间限制:1s1s

    空间限制:256MB256MB

    来源

    UOJ Goodbye Jiawu

    思路同上;

    代码实现

     1 #include<cstdio>
     2 int n,m,ans;
     3 int main(){
     4     scanf("%d",&m);
     5     while(m--){
     6         scanf("%d",&n);
     7         ans=n;
     8         while(n){n-=n&(-n);ans--;}
     9         printf("%d
    ",ans);        
    10     }
    11     return 0;
    12 }
  • 相关阅读:
    No.2 对象与内存控制(内存分配)
    No.1 数组与内存控制
    Json解析 在VS中
    MVC 搜索防止点击其他按钮
    执行多个lanmada表达式查询
    删除重复数据
    分页
    DataSet与二进制文件和XML文件
    关于时间的转换
    转换人民币大小金额
  • 原文地址:https://www.cnblogs.com/J-william/p/6039268.html
Copyright © 2011-2022 走看看