RPG的错排

Posted ping2yingshi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了RPG的错排相关的知识,希望对你有一定的参考价值。

此博客链接:https://www.cnblogs.com/ping2yingshi/p/12491394.html

RPG的错排(77min)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2068

Problem Description
今年暑假杭电ACM集训队第一次组成女生队,其中有一队叫RPG,但做为集训队成员之一的野骆驼竟然不知道RPG三个人具体是谁谁。RPG给他机会让他猜猜,第一次猜:R是公主,P是草儿,G是月野兔;第二次猜:R是草儿,P是月野兔,G是公主;第三次猜:R是草儿,P是公主,G是月野兔;......可怜的野骆驼第六次终于把RPG分清楚了。由于RPG的带动,做ACM的女生越来越多,我们的野骆驼想都知道她们,可现在有N多人,他要猜的次数可就多了,为了不为难野骆驼,女生们只要求他答对一半或以上就算过关,请问有多少组答案能使他顺利过关。
 
Input
输入的数据里有多个case,每个case包括一个n,代表有几个女生,(n<=25), n = 0输入结束。
 
Sample Input
1
2
0
 
Sample Output
1
1
题解:
         题意:知道n个人的名字,但是不知道谁对应谁,猜n个人的名字,猜对一半以上就算过关。
         方法:组合和错排。
         知识补充:           

                          需要用到错排公式以及高中数学排列组合的知识。

                          排列组合:    【1】排列(从n中拿出m个,并进行排列):     A_n_m=n!/(n-m)!=n*(n-1)*(n-2)*........(n-m+1);

                                             【2】组合(从n中拿出m个,不进行排列):     C_n_m=n!/((n-m)!*m!)=n*(n-1)*(n-2)*........(n-m+1)/(m*(m-1)*.......1);

         思路:

                  本题要求答对一半或以上人数,所以只需要求出小于一半的人数错排的可能的总和, 因为是从n个人里选出m个排错的人,因此需要对m排错的人(m<=n/2)进行组合,再乘以对应的排错人数最后在累加。

        注意:最后结果可能超过int 范围。

组合代码:

public static long  C_n_m(int n,int m){
        long sum1=1;
        long sum2=1;
        for(int i=n-m+1;i<=n;i++)
        {
            sum1=sum1*i;
        }
        for(int i=1;i<=m;i++)
        {
            sum2=sum2*i;
        }
        return sum1/sum2;
        
    }

错排代码:

            long []arr=new long[26];
            arr[0]=0;
            arr[1]=0;
            arr[2]=1;
            for(int i=3;i<=25;i++)
             {
                   arr[i]=(i-1)*(arr[i-1]+arr[i-2]);
             }

 

代码如下:

import java.util.Scanner;


public class test {
    public static long  C_n_m(int n,int m){
        long sum1=1;
        long sum2=1;
        for(int i=n-m+1;i<=n;i++)
        {
            sum1=sum1*i;
        }
        for(int i=1;i<=m;i++)
        {
            sum2=sum2*i;
        }
        return sum1/sum2;
        
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
       Scanner scan=new Scanner(System.in);
        
          
            long []arr=new long[26];
            arr[0]=0;
            arr[1]=0;
            arr[2]=1;
            for(int i=3;i<=25;i++)
             {
                   arr[i]=(i-1)*(arr[i-1]+arr[i-2]);
             }
            while(scan.hasNext())
            {
                  long result=1;
                  int n=scan.nextInt();
                  if(n==0)
                  {
                      break;
                  }
                
                  for(int i=1;i<=n/2;i++) 
                      result+=arr[i]*C_n_m(n,i);
                 
                  System.out.println(result);
               
            }

      }
    

}

 

 

以上是关于RPG的错排的主要内容,如果未能解决你的问题,请参考以下文章

hdu2068 RPG的错排

hdu2068 RPG的错排 组合数/递推

hdu2068-RPG的错排-(dp递推式)

HDU 2068 RPG错排 错排公式

(测试)

错排问题