新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)F 猴子排序的期望【Java/高精度/组合数学+概率论】

链接: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

原文地址:https://www.cnblogs.com/Roni-i/p/8993277.html

时间: 2024-11-15 13:45:40

新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)F 猴子排序的期望【Java/高精度/组合数学+概率论】的相关文章

新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)- 猴子排序的期望

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

H. GSS and Simple Math Problem--“今日头条杯”首届湖北省大学程序设计竞赛(网络同步赛)

题目描述:链接点此 这套题的github地址(里面包含了数据,题解,现场排名):点此 题目描述 Given n positive integers , your task is to calculate the product of these integers, The answer is less than 输入描述: The first line of input is an integer n, the i-th of the following n lines contains the

[2012山东省第三届ACM大学生程序设计竞赛]——Fruit Ninja II

Fruit Ninja II 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2416 Time Limit: 5000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Have you ever played a popular game named "Fruit Ninja"? Fruit Ninja (known as Fruit Ninja

Alice and Bob(2013年山东省第四届ACM大学生程序设计竞赛)

Alice and Bob Time Limit: 1000ms   Memory limit: 65536K 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1). Then Alice as

sdut Mountain Subsequences 2013年山东省第四届ACM大学生程序设计竞赛

Mountain Subsequences 题目描述 Coco is a beautiful ACMer girl living in a very beautiful mountain. There are many trees and flowers on the mountain, and there are many animals and birds also. Coco like the mountain so much that she now name some letter s

[2012山东省第三届ACM大学生程序设计竞赛]——n a^o7 !

n a^o7 ! 题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2413 Time Limit: 1000MS Memory limit: 65536K 题目描述 All brave and intelligent fighters, next you will step into a distinctive battleground which is full of sweet and hap

angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 题目描述 The problems called "Angry Birds" and "Angry Birds Again and Again" has been solved by many teams in the series of contest in 2011 Multi-University Tr

[2013山东省第四届ACM大学生程序设计竞赛]——Alice and Bob

Alice and Bob Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Alice and Bob like playing games very much.Today, they introduce a new game. There is a polynomial like this: (a0*x^(2^0)+1) * (a1 * x^(2^1)+1)*.......*(an-1 * x^(2^(n-1))+1). T

第八届山东省ACM大学生程序设计竞赛个人总结

因为省赛,从开学紧张到5月7号.心思也几乎全放在ACM的训练上.因为我还是校台球协会的会长,所以台协还有一些事情需要忙,但是我都给延迟了.老会长一直在催我办校赛,但我一直说 等等吧,因为校赛只能在周六或周日举办,而我们的ACM组队集训也都在周六周日, 如果我去支持校赛的话,那么一整天的集训就浪费了.不止这样,前期的准备工作也挺耗时的.就这样,我到现在都还没举办校赛(打算定在5月14号,不过那天我得去清华参加一个ACM邀请赛,所以还是主持不了,得让副会长去主持了,因为这个比赛不能再推了,再下个周又