o.boj 1446 冰淇淋

 
 
注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。


冰淇淋

Submit: 249    Accepted:72
Time Limit: 2000MS  Memory Limit: 65536K
Description
明光村小学要开学了,小朋友们要去文具店买新的文具。小朋友们需要的文具有圆规、直尺、橡皮、作业本、铅笔、钢笔、圆珠笔、墨水等等。特殊的是,明光村文具店还售卖冰淇淋,这可是小朋友们的都喜欢的啊!
912班的小朋友们组织一起去排队买文具。可是到文具店的时候,小朋友们发现只有铅笔和作业本还有,而且可以满足所有小朋友的需求,但冰淇淋却很紧缺了。为了有一个良好的秩序,小朋友们一人只能买一种文具(或者冰淇淋),而且只能买一份。yicou小朋友特别喜欢吃冰淇淋了,他不知道排到他的时候还能不能买到冰淇淋了。他踮起脚向前看,知道排在他前面有多少人。他很想知道他能买到冰淇淋的概率是多少。可是yicou现在只会加减法,不知道怎么算。你可以帮帮他吗?
例如yicou前面有2个小朋友,只剩一个冰淇凌
如果有两个小朋友排在yicou的前面,那么这两个小朋友可能选择的情况有
{第一个,第二个}:
1、铅笔,铅笔
2、铅笔,作业本
3、铅笔,冰淇淋
4、作业本,铅笔
5、作业本,作业本
6、作业本,冰淇淋
7、冰淇淋,铅笔
8、冰淇淋,作业本
一共有8种情况,只有在1、2、4、5的情况下,yicou才能买到冰淇淋。那么他能买到冰淇淋的概率位4/8 = 50%。


Input
多组测试数据。每组测试数据包括两个整数,N(1<= N <= 50)和 S(0 <= S <= 50),其中N表示排在yicou前面的小朋友的人数,S表示剩下的冰淇淋的份数。数据以EOF结束


Output
对于每组测试数据,输出yicou能买到冰淇淋的概率,以百分比的形式,且保留到小数点后第5位。


Sample Input

2 1
3 2
4 0
4 1
10 10
14 9
30 14


Sample Output

50.00000
76.92308
0.00000
33.33333
99.99831
98.65515
95.16071


Source
Sapphire@Buptacm
 
 
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <stdio.h>

using namespace std;

double C(double a,double b)
{
    double i = 1;
    double num = 1;
    
    for (; i <=b; i++)
    {
        num = num * a / i;
        a--;
    }
    return num;
}

double TWO_JC(double n)
{
    double num = 1, temp;
    //long long m = 0, t1, t2;    
    double t1;  
    
    if (n == 0)
        return 1;
    else
    {
        temp = 2;
        t1 = 1;
        while (n)
        {
            while (t1 <= n/2)
            {
                temp = temp * temp;
                t1 *= 2;
            }
            
            num *= temp;
            n -= t1;
            t1 = 1;
            temp = 2;
        }
        return num;
    }
}

int main()
{
    double N, S;
    double T, F;
    double Z;
                
    while (cin >> N >> S)    
    {
        if (N >= S)
        {
     
            T = TWO_JC(N);
            for (int i = 1; i <= S; i++)
                T += TWO_JC(N-i) * C(N,i);
            
            F = T - TWO_JC(N-S) * C(N,S);
    
            Z = ((double)F / (double)T);
            Z *= 100;             
        }
        else
            Z = 100;
        cout << setiosflags(ios_base::fixed)
             << setprecision(5) << Z << endl;
                
    } 
     system("pause");
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值