美文网首页
9_3站队问题

9_3站队问题

作者: X_Y | 来源:发表于2017-09-29 15:34 被阅读7次

    n个人站队,他们的编号依次从1到n,要求编号为a的人必须在编号为b的人的左边,但不要求一定相邻,请问共有多少种排法?第二问如果要求a必须在b的左边,并且一定要相邻,请问一共有多少种排法?

    给定人数n及两个人的编号a和b,请返回一个两个元素的数组,其中两个元素依次为两个问题的答案。保证人数小于等于10。

    测试样例:
    输入:7,1,2
    返回:[2520,720]

    // 还有另外一种解法,先全排列,a不是在b左边就是在b右边,且这两个的数量相同,所以第一问为:n! / 2,第二问则是把ab捆绑,当做一个人,然后全排列
    class StandInLine {
    public:
        int factorial(int n)
        {
            if(n == 0) return 1;
            return n*factorial(n-1);
        }
    
        int permutation(int i, int j)
        {
            return factorial(i) / factorial(i - j);
        }
    
        int combination(int i, int j)
        {
            return permutation(i, j) / factorial(j);
        }
        vector<int> getWays(int n, int a, int b) {
            // write code here
            vector<int> res(2, 0);
            res[0] = factorial(n-2) * combination(n, 2);
            res[1] = factorial(n-1);
            return res;
        }
    };
    

    相关文章

      网友评论

          本文标题:9_3站队问题

          本文链接:https://www.haomeiwen.com/subject/uzmiextx.html