UVA.11636 Hello World! (思维题)
题意分析
这题挺水的,还是错了几发。 QWQ。
有一个同学打了一行hello world,现在他想打n行hello world,请问最少复制粘贴几次。
先说说我的XX想法。绝对是中了二进制的邪!样例给给打好呀,如果我想输出4个,那么复制一次,得到2个,再复制一次得到4个。然后就莫名其妙的和二进制连起来了。
十进制———-二进制
0————–00000000
1————–00000001
2————–00000010
3————–00000011
4————–00000100
然后十进制对应的2^n就是在这个次数下最多得到的次数,然后又莫名其妙的想到了昨天写的(s &(1<< n)。结果可想而知,就是错了。
还是说正解吧。
假设复制n次,最多的到的个数是2^n,这个是确定无疑的,因为每次都将个数乘2嘛。于是我们可以从小到大依次枚举,即依次乘2,什么时候超过了给定的n,那么就说明这个就是最小的复制次数。下举例说明:
1.n=3
第一次 1 * 2 = 2
第二次 2 * 2 = 4 结束。
实际的复制情况是
1 * 2 = 2 , 2+1 = 3。
2.n=5
第一次 1 * 2 = 2
第二次 2 * 2 = 4
第三次 4 * 2 = 8
3.n=100
第一次 1 * 2 = 2
第二次 2 * 2 = 4
第三次 4 * 2 = 8
第四次 8 * 2 = 16
第五次 16 * 2 = 32
第六次 32 * 2 = 64
第七次 64 * 2 = 128
然后每次乘2,可以用位运算来简化。
说到底还是有点二进制的色彩的。
代码总览
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int n,kase = 0;
while(scanf("%d",&n)&&n>0){
int ans = 0;
while(1<<ans<n) ans++;
printf("Case %d: %d\n",++kase,ans);
}
return 0;
}