• hdu 2048


    Problem Description
    HDU 2006'10 ACM contest的颁奖晚会隆重开始了!
    为了活跃气氛,组织者举行了一个别开生面、奖品丰厚的抽奖活动,这个活动的具体要求是这样的:
    首先,所有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;
    然后,待所有字条加入完毕,每人从箱中取一个字条;
    最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
    大家可以想象一下当时的气氛之热烈,毕竟中奖者的奖品是大家梦寐以求的Twins签名照呀!不过,正如所有试图设计的喜剧往往以悲剧结尾,这次抽奖活动最后竟然没有一个人中奖!
    我的神、上帝以及老天爷呀,怎么会这样呢?
    不过,先不要激动,现在问题来了,你能计算一下发生这种情况的概率吗?
    不会算?难道你也想以悲剧结尾?!
    Input
    输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(1<n<=20),表示参加抽奖的人数
    Output
    对于每个测试实例,请输出发生这种情况的百分比,每个实例的输出占一行, 结果保留两位小数(四舍五入),具体格式请参照sample output。
    Sample Input
    1 2
    Sample Output
    50.00%
    Author
    lcy
    Source
    Recommend
    lcy

    解题思路

    a[n-1]为n-1个人的错排数,第n个人有n-1个位置可以选择,排的k位置的话,k位置的人如果在n位置则有a[n-1]中错排方式,不在n位置则有a[n-2]中错排方式。

    所有总的错排方式为a[n]=(n-1)*(a[n-1]+a[n-2])

    #include<iostream>
    #include<iomanip>
    using namespace std;
    int main()
    {
        int n;//输入例子数
        double a[21];//记录错排的数
        a[1]=0;
        a[2]=1;
        cin>>n;
        for(int k=3;k<=20;k++)
            {
                a[k]=(k-1)*(a[k-1]+a[k-2]);
            }
        while(n--)
        {
            int i;
            double sum=1;//总情况
            cin>>i;//参与的人数
            for(int j=1;j<=i;j++)
                sum*=j;//所有排列的可能
            double temp;
            temp=a[i]/sum;
            temp=temp*100;
            cout<<setiosflags(ios::fixed)<<setprecision(2);
            cout<<temp<<"%"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    说一下 session 的工作原理?
    说一下 JSP 的 4 种作用域?
    MVC的各个部分都有那些技术来实现?如何实现?
    window.onload()函数和jQuery中的document.ready()有什么区别?
    JQuery有几种选择器?
    jQuery 库中的 $() 是什么?
    按照锁的粒度分数据库锁有哪些?锁机制与InnoDB锁算法?
    隔离级别与锁的关系?
    Java语言基础(二)之数据类型转换、运算符、方法入门
    Java语言基础(一)
  • 原文地址:https://www.cnblogs.com/biong-blog/p/4421506.html
Copyright © 2020-2023  润新知