济南学习 Day 3 T1 pm

巧克力棒(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 点成就感。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 long long A,B;
 6 int main()
 7 {
 8     scanf("%I64d",&A);
 9     B=A;
10     while(A)
11     {
12         B-=(A%2);
13         A/=2;
14     }
15     printf("I64d",B);
16     
17     return 0;
18 }
19 /*
20 思路(解析): 
21 发现ans=n-c(n)。c(n)表示n的二进制中1的个数。
22 
23 粘一个严谨的证明(其实我自己也没认真看)
24 我们对c(n)进行归纳。
25 当c(n)=1时,即n=2^k,ans(n)显然=(n-1)。
26 我们假设c(n)<=x的情况下ans(n)=n-c(n)都成立。
27 当c(n)=x+1时,我们要证明ans(n)=n-c(n)。
28 令j为不超过n的2的幂次的最大值,
29 有ans(n)=ans(n-j)+ans(j)=n-j-(c(n)-1)+j-1=n-c(n)。
30 即ans(n)的下界为n-c(n)。
31 将ans(n)分成两个数i,j时有c(i)+c(j)>=c(n)。
32 当i不等于j时,有ans(n)<=i-c(i)+j-c(j)<=n-c(n)。
33 当i=j时,有c(i)+c(j)=2*c(n),
34 ans(n)<=i-c(i)+j-c(j)+1<=n-c(n)*2+1,c(n)是正整数。
35 综上,ans(n)的上界也为n-c(n)。假设成立
36 */

 

posted @ 2016-11-07 14:35  浮华的终成空  阅读(127)  评论(0编辑  收藏  举报

Contact with me