zoukankan      html  css  js  c++  java
  • 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
    ",dp[N]);
        }
        return 0;
    }
  • 相关阅读:
    HDU 5791 Two(训练题002 F)
    HDU 5783 Divide the Sequence (训练题002 B)
    关于01背包和完全背包二重循环的顺序(前人之技,后人惊叹)
    关于01背包求第k优解
    最长上升子序列(logN算法)
    ACM课程总结
    Problem F
    关于狄克斯特拉算法(dijkstra)总结
    Problem I
    OBJ文件格式分析工具: objdump, nm,ar
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5330938.html
Copyright © 2011-2022 走看看