Knots(找规律)

Knots

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 250    Accepted Submission(s): 173

Problem Description
An even number N of strands are stuck through a wall. On one side of the wall, a girl ties N/2 knots between disjoint pairs of strands. On the other side of the wall, the girl's groom-to-be also ties N/2 knots between disjoint pairs of strands. You are to find the probability that the knotted strands form one big loop (in which case the couple will be allowed to marry). 
For example, suppose that N = 4 and you number the strands 1, 2, 3, 4. Also suppose that the girl has created the following pairs of strands by tying knots: {(1, 4), (2,3)}. Then the groom-to-be has two choices for tying the knots on his side: {(1,2), {3,4)} or {(1,3), (2,4)}.
 

 

Input
The input file consists of one or more lines. Each line of the input file contains a positive even integer, less than or equal to 100. This integer represents the number of strands in the wall.
 

 

Output
For each line of input, the program will produce exactly one line of output: the probability that the knotted strands form one big loop, given the number of strands on the corresponding line of input. Print the probability to 5 decimal places.
 

 

Sample Input
4 20
 

 

Sample Output
0.66667 0.28377
 

题解:画图+模拟;题意是绑绳,新娘新浪各自把N个绳,两两绑在一块,变成N/2个绳子,如果新娘新浪绑的绳子能组成大圆就能结婚,问能结婚的概率;

如果两个,1 2 2 1,必然成环;是1;4个,相当于两个线段 一:1-2  3-4;二:1-3  2-4或者三:1-4 2-3;总共三种情况,对于每一种情况,另两个都能与他成环;所以是2/3;

6个,三个线段;- - -;看看就是4/5;由于1-2 3-4 5-6;也可以是1-2 3-5 4-6;所以也要考虑 - -的匹配情况所以要乘上两个线段的情况;4/5*2/3;。。。。。

最后可以推出规律dp[i] = dp[i - 1]*(i-2)/(i-1);

代码:

extern "C++"{
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
typedef long long LL;
void SI(int &x){scanf("%d",&x);}
void SI(double &x){scanf("%lf",&x);}
void SI(char *x){scanf("%s",x);}
//void SI(LL &x){scanf("%lld",&x);}

void PI(int &x){printf("%d",x);}
void PI(double &x){printf("%lf",x);}
void PI(char *x){printf("%s",x);}
//void PI(LL &x){printf("%lld",x);}

}
int main(){
    double dp[110];
    dp[2] = 1;
    for(int i = 4;i <= 100; i += 2){
        dp[i] = dp[i - 2] * (i - 2)/(i - 1);
    }
    int N;
    while(~scanf("%d",&N)){
        printf("%.5lf\n",dp[N]);
    }
    return 0;
}

 

posted @ 2016-03-28 22:20  handsomecui  阅读(325)  评论(0编辑  收藏  举报