• hdu 4061 A Card Game


    思路:

    分析:假设取的牌顺序是一个序列,那么这种序列在末尾为1时是和取牌序列一一对应的,且是符合“游戏结束时牌恰好被取完”的一种情况。

    简证:1、在序列中,任一数 i 的后一个数 j 是必然要放在第 i 堆里的。而值为 i 的数有 a[i]个,所以在 i 后面的数也恰好a[i]个,所以a[i]个数被放到第 i 堆,符合题目约束条件。

    2、在序列中,由于游戏是从第一堆开始的,所以第一个数虽然没有前驱,但是他是放在第 1 堆的。所以如果 1 不为最后一个数,那么第一堆中必然有a[1]+1个数了,不行。

    3、序列中的最后一个数 记 i ,如果不为 1 ,那么值 i 就只有a[i]-1个后继了。

    4、结合2、3,易知只有最后一个数为 1 ,堆容量a[i]才会都符合。才能根据此序列构造一种符合的分堆及取牌(题目原意是随机取的)情况,即一一对应。

    所以至此,题目转变为N个数的全排列,其中最后一个数为1的概率是多少。先从a[1]个1里取一个1,有a[1]种,然后剩下的N-1个数全排列有(N-1)!种,所以总共符合有a[1]*(N-1)!种。而N个数全排列有N!种。所以概率为a[1]/N。而N = sum(a[i])。

    代码如下:

     1 #include<stdio.h>
     2 #include<cstring>
     3 #include<algorithm>
     4 #define I(x) scanf("%d",&x)
     5 using namespace std;
     6 int main(){
     7     int n,a,sum,t,b,ca=0;
     8     I(t);
     9     while(t--){
    10         I(n);
    11         sum=0;
    12         for(int i=0;i<n;i++){
    13             I(a);
    14             sum+=a;
    15             if(i==0) b=a;
    16         }
    17         printf("Case %d: %.6lf
    ",++ca,1.0*b/sum);
    18     }
    19     return 0;
    20 }
    View Code
  • 相关阅读:
    Oracle误删除数据和表的恢复办法包括truncate
    SQL中简单函数介绍
    SQL中的null
    oracle数据库实例后台进程
    常用查询视图
    AIX 常用命令积累(未完待续)
    查询当前用户下的表/查询某一个用户的表
    查询统计运行和采控库里所有用户下的记录数大于5000万条的表
    使用orace数据库自带的sqldeveloper
    PL/SQL Developer
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3292431.html
Copyright © 2020-2023  润新知