开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛

规律:a[i][j]=     1/i * a[i-1][j-1]      +      (i-1)/i * a[i-1][j]; 

(少一个盒子时使用j-1 次魔法的概率)   (少一个盒子时使用j次魔法的概率)

公式推导如下:

设a[i][j]为打开i个盒子正好需要j次魔法的情况。

1->1

1->1 , 2->2;        两次

1->2 , 2->1;        一次

1->1 , 2->2 , 3->3;     三次

1->2 , 2->1 , 3->3;     两次         3->3(n->n) 的这种情况单独考虑(因为必需要使用一次魔法)   含有(n->n)的情况发生的概率为1/n,

所以 比如a[3][2] = 1/n *a[2][1] (2个盒子时使用1次魔法的情况 <加上当前这次正好使用2次魔法>)    +    ....(先不考虑)

1->3 , 2->1 , 3->2;     一次

1->1 , 2->3 , 3->2;     两次      仔细观察会发现当3->2时 其中的 1次2次 和①中的 1次2次 相同    3->1也是如此.

1->3 , 2->2 , 3->1;     两次      上式的....就是这种情况,而这种不含有n->n的概率会是 (n-1)/n   所以为  (n-1)/n * a[i-1][j] (少一个盒子时使用j次魔法的概率)

1->2 , 2->3 , 3->1;     一次

#include <cstdio>
using namespace std;

double a[5001][5001];   //当时不知道能开辣么大 ~~~~(>_<)~~~~ 

int main()
{
    int n, k;
    double ans;

    for(int i=1; i<=5000; i++)  a[i][1]=1.0/i;
    for(int i=2; i<=5000; i++){
        for(int j=2; j<=i; j++){
            if(i==j)    a[i][j] = a[i-1][j-1]*1.0/i;
            else        a[i][j] = 1.0/i*a[i-1][j-1]+(i-1)*1.0/i*a[i-1][j];
        }
    }
    while( scanf("%d%d", &n, &k)!=-1 ){
        ans = 0.0;
        for(int i=1; i<=k; i++)
            ans += a[n][i];
        printf("%.4f\n", ans);
    }

    return 0;
}

开锁魔法II

Time Limit: 3000 MS Memory Limit: 256000 K

Total Submit: 6(4 users) Total Accepted: 3(3 users)
Rating: Special Judge: No

Description

一日,崔克茜来到小马镇表演魔法。

其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它。崔克茜可以通过魔法,暴力打开一个盒子。但是崔克茜最多只可以使用 k 次魔法,问在 k 次魔法内,打开所有盒子的概率是多少。

Input

多组测试数据。

每组数据第一行有一个整数 n 和一个整数 k。(1 <= k <= n?<= 5000)

Output

对于每组数据,输出一行表示对应的答案。结果保留四位小数。

Sample Input

3 1

3 2

3 3

10 3

Sample Output

0.3333

0.8333

1.0000

0.7061

Source

哈尔滨理工大学第五届ACM程序设计竞赛

时间: 2024-10-12 16:07:30

开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛的相关文章

bzoj5003: 与链 5004: 开锁魔法II 5005:乒乓游戏

www.lydsy.com/JudgeOnline/upload/task.pdf 第一题题意可以转为选一个长度k的序列,每一项二进制的1的位置被下一项包含,且总和为1,考虑每个二进制位的出现位置,可以转化为一个多重背包求方案数的问题. 第二题构成一些环,可以每个环直接计算,然后合并答案. 第三题区间包含相当于单向边,区间相交不包含就是双向边,将区间相交不包含的情况缩点,剩余的单向边构成一棵树(几个被缩起来的区间可以用它们的并集表示),用lct维护树形态,查询即为询问两点是否是祖先关系,对于修改

哈理工2249开锁魔法 概率dp

开锁魔法II Time Limit: 3000 MS Memory Limit: 256000 K Total Submit: 23(18 users) Total Accepted: 18(16 users) Rating:  Special Judge: No Description 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.崔克茜可以通过魔法,暴力打开一个盒子.但是崔克茜最多只可以使用 k

没有什么不可能—记山东省第六届ACM程序设计竞赛(退役总结帖)

大一下学期,第一次听说了ACM这个词,当时每周六也开设了培训课,但我好像一次也没有去过,当时对这个词并没有什么太大的印象.后来学院里引进了自己的OJ,那时候我连基本的输入输出格式都不懂,当经历了一堆的WA,TLE之后突然换来的一个AC竟带来了莫名的喜悦.后来学院举办了第一届ACM程序设计竞赛,我报名参加了新秀赛和团队赛.三个小时的新秀赛,当时貌似做出了三道,意外的拿到了一等奖,这也成为了我大学生活的一个重要转折点.四个小时的团队赛,做得很艰难,各种不会,最后只做出了一道,排在三等奖的末尾.比赛之

hrb——开锁魔法I

解题思路:从1到n的倒数之和. #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ double ans=0; for(int i=1;i<=n;i++){ ans+=(1.0/i); } printf("%.4lf\n"

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

[ACM] hihoCoder 1075 开锁魔法III (动态规划,组合数学)

描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数 T (T ≤ 100)表示数据组数. 对于每组数据,第一行有两个整数 n 和 k (1?≤?n?≤?300,?0?≤?k?≤?n). 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 a

#1075 : 开锁魔法III

描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数 T (T ≤ 100)表示数据组数. 对于每组数据,第一行有两个整数 n 和 k (1 ≤ n ≤ 300, 0 ≤ k ≤ n). 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 a

Hiho #1075: 开锁魔法III

Problem Statement 描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数$T$ ($T \leq 100$)表示数据组数. 对于每组数据,第一行有两个整数$n$和$k$ ($1 \leq n \leq 300, 0 \leq k \leq 

HihoCoder 1075 开锁魔法III(概率DP+组合)

描述 一日,崔克茜来到小马镇表演魔法. 其中有一个节目是开锁咒:舞台上有 n 个盒子,每个盒子中有一把钥匙,对于每个盒子而言有且仅有一把钥匙能打开它.初始时,崔克茜将会随机地选择 k 个盒子用魔法将它们打开.崔克茜想知道最后所有盒子都被打开的概率,你能帮助她回答这个问题吗? 输入 第一行一个整数 T (T ≤ 100)表示数据组数. 对于每组数据,第一行有两个整数 n 和 k (1 ≤ n ≤ 300, 0 ≤ k ≤ n). 第二行有 n 个整数 ai,表示第 i 个盒子中,装有可以打开第 a