题目是: 程序员
小H是一个程序员。可是他很喜欢一些新奇的东西。 app
有一次,他去找物理实验室的朋友玩。他见到了一串很是有意思的粒子。N个粒子排成一排。每一秒中,每一段连续的粒子中会随意有一个爆炸,爆炸后该粒子就消失了,且将原来连续的一段粒子分隔成两段。 测试
小H但愿知道全部粒子都爆炸完的指望时间。 spa
Input .net
第一行为一个整数T(1 <= T<= 400),表示有T组测试数据; blog
每组数据一个正整数N(1<=N<=400),表示一开始的粒子数。 ip
Output get
对于每组数据,输出指望时间(秒)。保留五位小数。 flash
Sample Input
3
1
2
3
Sample Output
1.00000
2.00000
2.66667
Sample Cl.
对N=3,若第一个爆炸的粒子在旁边,则还需两秒;若第一个爆炸的在中间,则再过一秒便可。故答案为2/3*3+1/3*2=8/3。
代码以下
- float lizi(int n)
- {
- float t=0;
- int i;
- if(n==0)
- {
- return 0;
- }
- else if(n==1)
- {
- return 1;
- }
- else if(n>1)
- {
- t = (2.0/n)*(lizi(n-1)+1);
- for(i=n-2;i>0;i--)
- {
- if(i>(n-2)/2)
- t+=(2.0/n)*lizi(i);
- else if(i==(n-2)/2)
- t+=(1.0/n)*lizi(i);
-
- }
- return t;
- }
-
-
-
- }
- int _tmain(int argc, _TCHAR* argv[])
- {
- int num,i;
- float time;
- scanf("%d",&num);
- while(num<1||num>400){
- printf("整数T(1 <= T<= 400)\n");
- scanf("%d",&num);
- }
- int *test = (int *)malloc(num*sizeof(int));
- for(i=0;i<num;i++)
- {
- scanf("%d",test+i);
- while(*(test+i)<1||*(test+i)>400)
- {
- printf("粒子熟范围0<=n<=400\n");
- scanf("%d",test+i);
- }
- }
- for(i=0;i<num;i++)
- {
- //printf("%d\n",test[i]);
- time = lizi(test[i]);
- printf("%.5f\n",time);
- //system("pause");
- }
- //printf("%f",time);
- system("pause");
- return 0;
- }
这道题目不算太难,不过提有意思的,PS:提交时没注意保留小数点5位,分数被扣光了。。