Xinjiang University ACM-ICPC Programming Competition May Competition (Synchronous Competition) F Monkey Sorting Expectation [Java/High Precision/Combinatorial Mathematics + Probability Theory]

链接:https://www.nowcoder.com/acm/contest/116/F
来源:牛客网

题目描述 
我们知道有一种神奇的排序方法叫做猴子排序,就是把待排序的数字写在卡片上,然后让猴子把卡片扔在空中,等落下的时候观察这些卡片是否从左到右已经排序完成(我们认为不会发生卡片落地后叠在一起的情况)如果有序则排序完成,否则让猴子再扔一遍,直到卡片有序,那么问题来了,给你N个卡片,每个卡片上写着一个大写字母,请问猴子第一次扔这些卡片就按字典序排序完成的概率有多大?

输入描述:
第一行是一个整数N(1<N<100)表示给猴子N张卡片,接下来是一个长度为N的字符串,代表这些卡片上所写的字母。
输出描述:
输出一行,表示猴子排序第一次就成功的概率(用分子为1的分数表示)。
示例1
输入
7
SCIENCE
输出
1/1260

//This code is wrong, it's actually a string input that can't use nextLine but uses next? ? ? I r

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);
           
        }
    }

Use hash instead of map

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

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325299470&siteId=291194637