新疆大學ACM-ICPC程序設計競賽五月月賽(同步賽)F 猴子排序的期望【Java/高精度/組合數學+概率論】
阿新 • • 發佈:2018-05-05
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/高精度/組合數學+概率論】