C - Collecting Bugs

Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64u

Submit Status

Description

Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stuff, he collects software bugs. When Ivan gets a new program, he classifies all possible bugs into n categories. Each day he discovers exactly one bug in the program and adds information about it and its category into a spreadsheet. When he finds bugs in all bug categories, he calls the program disgusting, publishes this spreadsheet on his home page, and forgets completely about the program. 
Two companies, Macrosoft and Microhard are in tight competition. Microhard wants to decrease sales of one Macrosoft program. They hire Ivan to prove that the program in question is disgusting. However, Ivan has a complicated problem. This new program has s subcomponents, and finding bugs of all types in each subcomponent would take too long before the target could be reached. So Ivan and Microhard agreed to use a simpler criteria --- Ivan should find at least one bug in each subsystem and at least one bug of each category. 
Macrosoft knows about these plans and it wants to estimate the time that is required for Ivan to call its program disgusting. It's important because the company releases a new version soon, so it can correct its plans and release it quicker. Nobody would be interested in Ivan's opinion about the reliability of the obsolete version. 
A bug found in the program can be of any category with equal probability. Similarly, the bug can be found in any given subsystem with equal probability. Any particular bug cannot belong to two different categories or happen simultaneously in two different subsystems. The number of bugs in the program is almost infinite, so the probability of finding a new bug of some category in some subsystem does not reduce after finding any number of bugs of that category in that subsystem. 
Find an average time (in days of Ivan's work) required to name the program disgusting.

Input

Input file contains two integer numbers, n and s (0 < n, s <= 1 000).

Output

Output the expectation of the Ivan's working days needed to call the program disgusting, accurate to 4 digits after the decimal point.

Sample Input

1 2

Sample Output

3.0000

题目大意

一个软件有 s 个子系统,存在 n 种 bug。某人一天能找到一个 bug。问,在这个软件中找齐 n 种 bug,

并且每个子系统中至少包含一个 bug 的时间的期望值(单位:天)。注意:bug 是无限多的,每个 bug

属于任何一种 bug 的概率都是 1/n;出现在每个系统是等可能的,为 1/s。

做法分析

令 f[i][j] 表示已经找到了 i 种 bug,且 j 个子系统至少包含一个 bug,距离完成目标需要的时间的期望。

目标状态是 f[0][0]

再过一天找到一个 bug 可能是如下的情况:

1. 这个 bug 的种类是 已经找到的 并且 出现在 已经找到 bug 的子系统中

2. 这个 bug 的种类是 已经找到的 并且 出现在 没有找到 bug 的子系统中

3. 这个 bug 的种类是 没有找到的 并且 出现在 已经找到 bug 的子系统中

4. 这个 bug 的种类是 没有找到的 并且 出现在 没有找到 bug 的子系统中

经过简单的分析,不难得出如下递推过程:

f[i][j] =    i/n*j/s*f[i][j]

+ i/n*(s-j)/s*f[i][j+1]

+ (n-i)/n*j/s*f[i+1][j]

+ (n-i)/n*(s-j)/s*f[i+1][j+1]

移项可得

(1-(i*j)/(n*s))f[i][j] =    i/n*(s-j)/s*f[i][j+1]

+ (n-i)/n*j/s*f[i+1][j]

+ (n-i)/n*(s-j)/s*f[i+1][j+1]

逆向递推即可

注意这道题输出的是f[0][0],而不是f[1][1]。

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
double f[][];
int main()
{
int n,s;
while(scanf("%d%d",&n,&s)!=EOF)
{
memset(f,,sizeof(f));
for(int i=n;i>=;i--)
{
for(int j=s;j>=;j--)
{
if(i==n&&j==s)
continue;
double p1=double(s-j)*i/n/s;
double p2=double(n-i)*j/n/s;
double p3=double(n-i)*(s-j)/n/s;
double p0=1.0-double(i*j)/n/s;
f[i][j]=p1*f[i][j+]+p2*f[i+][j]+p3*f[i+][j+]+; //+1应该是因为要多进行一次所以+1
f[i][j]/=p0;
}
}
printf("%.4f\n",f[][]);
}
return ;
}

Poj 2096 Collecting Bugs (概率DP求期望)的更多相关文章

  1. poj 2096 Collecting Bugs (概率dp 天数期望)

    题目链接 题意: 一个人受雇于某公司要找出某个软件的bugs和subcomponents,这个软件一共有n个bugs和s个subcomponents,每次他都能同时随机发现1个bug和1个subcom ...

  2. POJ 2096 Collecting Bugs (概率DP,求期望)

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  3. POJ2096 Collecting Bugs(概率DP,求期望)

    Collecting Bugs Ivan is fond of collecting. Unlike other people who collect post stamps, coins or ot ...

  4. POJ 2096 Collecting Bugs (概率DP)

    题意:给定 n 类bug,和 s 个子系统,每天可以找出一个bug,求找出 n 类型的bug,并且 s 个都至少有一个的期望是多少. 析:应该是一个很简单的概率DP,dp[i][j] 表示已经从 j ...

  5. poj 2096 Collecting Bugs 概率dp 入门经典 难度:1

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2745   Accepted: 1345 ...

  6. poj 2096 Collecting Bugs - 概率与期望 - 动态规划

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  7. HDU3853-LOOPS(概率DP求期望)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  8. poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)

    Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...

  9. POJ 2096 Collecting Bugs 期望dp

    题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...

随机推荐

  1. C语言真正的编译过程(4个步骤~~预编译,编译,汇编,连接)

    转载自:https://www.cnblogs.com/wuyouxiaocai/p/5701088.html#commentform 说实话,很多人做了很久的C/C++,也用了很多IDE,但是对于可 ...

  2. B1018 锤子剪刀布 (20分)

    B1018 锤子剪刀布 (20分) 大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势. 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. ...

  3. 7-1 寻找大富翁 PTA 堆排序

    7-1 寻找大富翁 (25 分) 胡润研究院的调查显示,截至2017年底,中国个人资产超过1亿元的高净值人群达15万人.假设给出N个人的个人资产值,请快速找出资产排前M位的大富翁. 输入格式: 输入首 ...

  4. 20145202马超《java程序设计》第一周学习总结

    这两天的学习让我对java有了初步的了解. 1.java是SUN公司推出的面相网络的编程语言. 特点:完全面向对象,与平台无关,跨平台性(例如c++只能在windows上执行,然而java并没有这些限 ...

  5. P1783 海滩防御

    P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...

  6. android 多行文本显示的textView

    package com.zhangyue.iReader.common.view; import android.content.Context; import android.graphics.Ca ...

  7. tp事务处理

    数据库事务处理见手册 逻辑事务处理 Model->startTrans(); // 开启事务 if(操作失败) { Model->rollback(); // 回滚 }else { Mod ...

  8. 剑指Offer - 九度1362 - 左旋转字符串(Move!Move!!Move!!!)

    剑指Offer - 九度1362 - 左旋转字符串(Move!Move!!Move!!!)2013-11-23 03:05 题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任 ...

  9. 《Cracking the Coding Interview》——第17章:普通题——题目5

    2014-04-28 22:44 题目:猜数字游戏.四个数字,每个都是0~9之间.你每猜一次,我都告诉你,有多少个位置和数字都对(全对),有多少个位置错数字对(半对).比如“6309”,你猜“3701 ...

  10. Pascal游戏 大富翁MUD

    大富翁MUD Pascal源码 Chaobs改编自百度网友作品 此源码非Chaobs原创,但转载时请仍注明出处. 估计90后以后就没有孩子知道MUD了. program wxtw; uses crt; ...