【ACM刷题录】UVa10288 Coupons

题目与出处

题目:Coupons

出处:UVa 10288

题意概述

描述:一共有n种不同的Coupons,每次得到每种Coupons的概率相同。问期望多少次可以得到所有的nCoupons,以带分数形式输出。

数据范围:1<=n<=33

算法分析

该题目涉及到求数学期望,可以采用分治法的思想,每一次在上一次的期望下得到最新的期望。当已经有kCoupons得到时,得到新的Coupons的概率为(n-k)/n,期望值为n/(n-k),所以可以得出总步数的期望值为:

代码实现

代码实现为java实现

package main;

 

public class Coupons {

   

    public static class Fraction{

       //分子

       public long numerator;

       //分母

       public long denominator;

      

       public Fraction(long numerator, long denominator){

           this.numerator = numerator;

           this.denominator = denominator;

       }

      

       public void add(Fraction frac){

           long num1 = this.numerator * frac.denominator;

           long num2 = this.denominator * frac.numerator;

           long theNumerator = num1+num2;

           long theDenominator = this.denominator * frac.denominator;

           this.numerator = theNumerator;

           this.denominator = theDenominator;

           release();

       }

      

       public void show(){

           System.out.println(this.numerator + "/" + this.denominator);

       }

      

       //辗转相除法求进行约分

       private void release(){

           long tempBig = this.numerator > this.denominator ? this.numerator:this.denominator;

           long tempSmall = this.numerator < this.denominator ? this.numerator:this.denominator;

           long temp;

           while(tempBig % tempSmall != 0){

              temp = tempBig % tempSmall;

              tempBig = tempSmall;

              tempSmall = temp;

           }

           temp = tempSmall;

           this.numerator = this.numerator / temp;

           this.denominator = this.denominator / temp;

       }

    }

   

    public static Fraction coupons(long n){

       Fraction answer = new Fraction(0,1);

       for(long i=0; i<n; i++){

           answer.add(new Fraction(n, n-i));

       }

       answer.show();

       return answer;

    }

   

    public static void main(String args[]){

       coupons(33);

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值