zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    架构设计之NodeJS操作消息队列RabbitMQ
    如何搭建一个功能复杂的前端配置化框架(一)
    Web as a App(Web既APP)的概念可以提出吗?
    Bottle源码阅读笔记(二):路由
    Bottle源码阅读笔记(一):WSGI
    Python__slots__详解
    [译]如何在Web开发中使用Python
    C#中Internal关键字的总结
    [DataContract]引用
    分享一个与ABP配套使用的代码生成器源码
  • 原文地址:https://www.cnblogs.com/biong-blog/p/4421506.html
Copyright © 2011-2022 走看看