1. 程式人生 > >新疆大學ACM-ICPC程序設計競賽五月月賽(同步賽)F 猴子排序的期望【Java/高精度/組合數學+概率論】

新疆大學ACM-ICPC程序設計競賽五月月賽(同步賽)F 猴子排序的期望【Java/高精度/組合數學+概率論】

keyset 競賽 turn ext ID return 組合數學 AS vid

鏈接:https://www.nowcoder.com/acm/contest/116/F
來源:牛客網

題目描述 
我們知道有一種神奇的排序方法叫做猴子排序,就是把待排序的數字寫在卡片上,然後讓猴子把卡片扔在空中,等落下的時候觀察這些卡片是否從左到右已經排序完成(我們認為不會發生卡片落地後疊在一起的情況)如果有序則排序完成,否則讓猴子再扔一遍,直到卡片有序,那麽問題來了,給你N個卡片,每個卡片上寫著一個大寫字母,請問猴子第一次扔這些卡片就按字典序排序完成的概率有多大?

輸入描述:
第一行是一個整數N(1<N<100)表示給猴子N張卡片,接下來是一個長度為N的字符串,代表這些卡片上所寫的字母。
輸出描述:
輸出一行,表示猴子排序第一次就成功的概率(用分子為1的分數表示)。
示例1
輸入
7
SCIENCE
輸出
1/1260

//這個代碼找到錯了,居然是string輸入不能用nextLine而要用next???我r
【分析】:分母為A(n,n)/字符串中多次出現的字符出現次數的階乘=n!/ (k1! * k2! * ...)

首先,next()一定要讀取到有效字符後才可以結束輸入,對輸入有效字符之前遇到的空格鍵、Tab鍵或Enter鍵等結束符,next()方法會自動將其去掉,只有在輸入有效字符之後,next()方法才將其後輸入的空格鍵、Tab鍵或Enter鍵等視為分隔符或結束符。簡單地說,next()查找並返回來自此掃描器的下一個完整標記。完整標記的前後是與分隔模式匹配的輸入信息,所以next方法不能得到帶空格的字符串而nextLine()方法的結束符只是Enter鍵,即nextLine()方法返回的是Enter鍵之前的所有字符,它是可以得到帶空格的字符串的。

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.io.*;
import java.math.*;
public class Main{

    public static BigInteger fun(int n){
        BigInteger num = BigInteger.ONE;  
        for(int i=1;i<=n;i++)
            num=num.multiply(BigInteger.valueOf(i)); 
        return num;  
    }
//7 SCIENCE
//1/1260
    public static void main(String[] args) {
           
           Scanner cin = new Scanner(System.in);
           
           int n = cin.nextInt();
           String s = cin.nextLine(); //!!!!!!改成next()
           char[] a=s.toCharArray();
           
           Map<Character, Integer> map = new HashMap<Character,Integer>();  
           
           BigInteger pro = fun(n);
           //System.out.println(pro);
           for(char c : a)
           {//記錄每個字符出現次數,若未出現初始化為1,否則不斷+1
               map.put(c, !map.containsKey(c)?1:(map.get(c)+1));
           }
           //遍歷map,map.get(key)是得到鍵所對應的值
           for(Character key : map.keySet()) {  
                //System.out.println(key + "=" + map.get(key));  
                if(map.get(key)>1) {
                    pro = pro.divide(fun(map.get(key)));
                }
            }  
           System.out.print(1);
           System.out.print("/");
           System.out.println(pro);
           
        }
    }

不用map用hash

import java.io.*;
import java.util.*;
import java.util.Scanner;
import java.math.BigInteger;
import java.lang.*;

public class Main{

    static BigInteger fun(int n){
        BigInteger num = BigInteger.ONE;  
        for(int i=2; i<=n; i++)
            num = num.multiply(BigInteger.valueOf(i)); 
        return num;  
    }

    public static void main(String[] args) {
           
           Scanner cin = new Scanner(System.in);
           
           int n = cin.nextInt();
           String s = cin.next();
           int[] arr = new int[500];
           
           for(int i=0; i<s.length(); i++) {
               arr[s.charAt(i)-'A']++;
           }
           
           BigInteger pro = fun(n);
           
           for(int i=0;i<500;i++) {
               if(arr[i]!=0) {
                   pro = pro.divide(fun(arr[i]));
               }
           }
           System.out.println("1/"+pro);
           
        }
    }
//7 SCIENCE
//1/1260

新疆大學ACM-ICPC程序設計競賽五月月賽(同步賽)F 猴子排序的期望【Java/高精度/組合數學+概率論】