題目是: 程序員
小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位,分數被扣光了。。