题目大意:一开始有一条语句printf("Hello World! ");你可以选择复制粘贴,问要输出n行Hello World!最少要复制几次?
分析:大水题,每次复制粘贴当前所有的语句则可以使次数最少,所以答案就是ceil(l(logn)/(log2))。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 int main() 7 { 8 int n,Case=1; 9 while(scanf("%d",&n)==1) 10 { 11 if(n<0) break; 12 printf("Case %d: %d ",Case++,(int)ceil(log(n)/log(2))); 13 } 14 return 0; 15 }
有一道题目跟这个很像:VIJOS-P1361
Description
有n个球,从外表上看不出差别,但有一个球比其他球重,其他N-1个球质量相等。请问:在地球上(MS废话),用天平最少称几次可以称出来?
Input
一个自然数N(0< N< =2^24)
Output
输出用天平最小的称量数m(m< 30000)
Sample Input
8
Sample Output
2
这个题目如何产生最优?我们可以发现称一次最多可以分辨出3个球里的那个假球,称两次则是9,三次则是27,n次为3^n,所以结果就是ceil(l(logn)/(log3))。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 using namespace std; 6 long long n; 7 int main () 8 { 9 while(scanf("%lld",&n)!=EOF) 10 { 11 printf("%d ",(int)ceil(log(n)/log(3))); 12 } 13 }