850 AlvinZH的学霸养成记III

思路

难题。概率DP。

第一种思考方式:直接DP

dp[i]:从已经有i个学霸到所有人变成学霸的期望。

那么答案为dp[1],需要从后往前逆推。对于某一天,有可能会增加一个学霸or不增加。

①增加:\((dp[i+1] + 1) * P\)

②不增加:\((dp[i] + 1) * (1-P)\)

其中,\(P = i * (n - i) * p / (C(n,2))\),C(n,2) = (n - 1) * n / 2。其含义是:n个人中选出一非学霸一学霸的方法数/n个人中选出两人方法数。

状态转移方程:\(dp[i] = (dp[i + 1] + 1) * P + (dp[i] + 1) * (1 - P)\)。移项化简后可得: \(dp[i] = dp[i + 1] + 1 / P\) 。

其实可能正着想更简单,令dp[i]表示达到班内有i个学霸的期望天数。则有dp[1] = 0。相同的分析分发,最后依然可以得到 \(dp2[i] = dp[i-1] + 1/P\) 。最后答案为dp[n]。

优化一下,完全不需要这个dp数组,使用一个变量累加即可得到答案。

第二种思考方式:期望叠加

每天至多有一个人转化为学霸,考虑第i个人转化为学霸的期望天数D[i],那么所有人转化为学霸的期望天数 \(ans=D[1]+D[2]+…+D[n-1]\)。

设第i个人转化为学霸的概率为p[i],则第i个人转化为学霸服从几何分布。

几何分布:在n次伯努利试验中,试验k次才得到第一次成功的机率。详细地说,是:前k-1次皆失败,第k次成功的概率。

期望\(EX=1*a+2*(1-a)*a+3*(1-a)^2*a+...\) ,错位相减求和即可得期望为 \(1/p[i]\)。

故 \(D[i]=1/p[i]\) ,而 \(p[i]=p*i*(n-i)/(n*(n-1)/2)\),所以 \(D[i]=n*(n-1)/(2*p*i*(n-i))\) ,那么我们就可以在O(n)的时间内得到ans值.

你可能已经发现,最后二者计算方法其实一模一样的,侧面证明答案正确。

分析

两种方法时间复杂度都为O(n)。

需要注意的问题是乘法溢出问题,在计算 \(n*(n-1) / (2*p*i*(n-i))\) 的过程中,有两个地方会溢出,一个是n(n-1),你可以通过(double)n(n-1)防止溢出,注意(double)(n(n-1))没有效果;第二个溢出是2i(n-i)p,你可以把p放前面先计算或者把i强制转换为浮点数防止溢出。

参考资料:有关概率和期望问题的研究

参考代码一

//
// Created by AlvinZH on 2017/9/15.
// Copyright (c) AlvinZH. All rights reserved.
// #include <cstdio>
#include <cstring>
#include <cstdlib>
#define MaxSize 100005 double dp[MaxSize];//dp[i]表示学霸数量为i时,到达目标的期望 int main()
{
int T, n;
double p, ans1, ans2, p1;
scanf("%d", &T);
while (T--)
{
scanf("%d%lf", &n, &p);
dp[n] = 0; for (int i = n-1; i > 0; i--)
{
ans1 = (double)i * (n-i);//选出一非学霸和一学霸
ans2 = (double)n * (n-1) / 2;//从n个人中选两个人 p1 = ans1 / ans2 * p;
dp[i] = dp[i+1] + 1.0/p1;
}
printf("%.3lf\n",dp[1]);
}
return 0;
}

参考代码二

//
// Created by AlvinZH on 2017/9/15.
// Copyright (c) AlvinZH. All rights reserved.
// #include<cstdio> int main()
{
int T, n;
double p, ans;
scanf("%d", &T);
while (T--)
{
scanf("%d %lf", &n, &p);
ans = 0.0;
for(int i = 1; i < n; i++)
ans += 1.0 * n* (n-1) / (2 * p * i * (n-i));
printf("%.3lf\n", ans);
}
return 0;
}

2016级算法第五次上机-D.AlvinZH的学霸养成记III的更多相关文章

  1. 2016级算法第五次上机-E.AlvinZH的学霸养成记IV

    1039 AlvinZH的学霸养成记IV 思路 难题,最大二分图匹配. 难点在于如何转化问题,n对n,一个只能攻击一个,判断是否存在一种攻击方案我方不死团灭对方.可以想到把所有随从看作点,对于可攻击的 ...

  2. 2016级算法第六次上机-F.AlvinZH的学霸养成记VI

    1082 AlvinZH的学霸养成记VI 思路 难题,凸包. 分析问题,平面上给出两类点,问能否用一条直线将二者分离. 首先应该联想到这是一个凸包问题,分别计算两类点的凸包,如果存在符合题意的直线,那 ...

  3. 2016级算法第六次上机-D.AlvinZH的学霸养成记V

    1081 AlvinZH的学霸养成记V 思路 中等题,计算几何. 这是一个排序问题,按极角排序.可以转化为叉积的应用,对于点A和B,通过叉积可以判断角度大小,共线时再判断距离. 叉积的应用.OA × ...

  4. 2016级算法第六次上机-C.AlvinZH的学霸养成记II

    1032 AlvinZH的学霸养成记II 思路 中等题,贪心. 所有课程按照DDL的大小来排序. 维护一个当前时间curTime,初始为0. 遍历课程,curTime加上此课程持续时间d,如果这时cu ...

  5. 2016级算法第五次上机-F.ModricWang的水系法术

    1066 ModricWang的水系法术 思路 比较典型的最大流问题,需要注意的是,题目已经暗示(明示)了这里的边是双向的,在建图的时候需要加上反向边的容量值. 解决最大流问题的基本思路就是不断在残量 ...

  6. 2016级算法第五次上机-C.Bamboo和"Coco"

    1064 Bamboo和"Coco" 分析题意 每个亡灵至少一个花瓣,相邻的亡灵中思念值高的要获得的花瓣高(思念值相等是不需要花瓣一样多的).主要考贪心思路,为了使得花瓣总量最少, ...

  7. 2016级算法第五次上机-B.Bamboo&APTX4844魔发药水

    Bamboo&APTX4844魔发药水 题意 "于是,Bamboo耐着性子,看巫师从袖子里掏出 M 瓶时光泉水和 K 粒绿色能量.每瓶时光泉水重量为 c ,生发效果为 l:每粒绿色能 ...

  8. 2016级算法第五次上机-A.Beihang Collegiate Pronunciation Contest 2017

    1065 Beihang Collegiate Pronunciation Contest 2017 思路 在字符串中不断做匹配 找到一个匹配就输出 时间复杂度\(O(n)\) ps.模式串是定长的, ...

  9. 2016级算法第五次上机-G.ModricWang的撒币游戏

    1062 ModricWang的撒币游戏 思路 此题为2017年ACM-ICPC亚洲区域赛乌鲁木齐赛区的A题,现场94个队中有38个队做出此题.在这里作为满分以外的题,是为了让大家看一下外面一些题的风 ...

随机推荐

  1. linux系统中的进程

    一.fork 在类unix系统中,我们所执行的任何程序,都是由父进程(parent process)所产生出来的一个子进程(child process),子进程在结束后,将返回到父进程去.此一现象被称 ...

  2. Python Windows下打包成exe文件

    Python Windows 下打包成exe文件,使用PyInstaller 软件环境: 1.OS:Win10 64 位 2.Python 3.7 3.安装PyInstaller 先检查是否已安装Py ...

  3. nhibernate GetType

    本原理 /* This code assumes an IEntity interface that identifies your persistent types. */ /// <summ ...

  4. ES5、6、7浅析

    ECMA Script 它是一种由ECMA组织(前身为欧洲计算机制造商协会)制定和发布的脚本语言规范 而我们学的JavaScript是ECMA的实现, 但术语ECMAScript和JavaScript ...

  5. cookie用法小结 cookie.setPath 跨域共享

    1. JSP中Cookie的读写 Cookie的本质是一个键值对,当浏览器访问web服务器的时候写入在客户端机器上,里面记录一些信息.Cookie还有一些附加信息,比如域名.有效时间.注释等等. 下面 ...

  6. bootstrap缩略图及警示框制作

    缩略图在网站中最常用的地方就是产品列表页面,一行显示几张图片,有的在图片底下(左侧或右侧)带有标题.描述等信息.Bootstrap框架将这一部独立成一个模块组件.并通过“thumbnail”样式配合b ...

  7. maven添加阿里仓库

    1.修改settings.xml 在maven的settings.xml 文件里配置mirrors的子节点,添加如下mirror <mirror> <id>nexus-aliy ...

  8. redis 通配符 批量删除key

    Redis 中 DEL指令支持多个key作为参数进行删除 但不支持通配符,无法通过通配符批量删除key,不过我们可以借助 Linux 的管道和 xargs 指令来完成这个动作. 比如要删除所有以use ...

  9. Mac开发者常用的工具

    http://www.oschina.net/news/53946/mac-dev-tools

  10. 团体程序设计天梯赛L1-025 正整数A+B 2017-03-23 22:47 61人阅读 评论(0) 收藏

    L1-025. 正整数A+B 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 本题的目标很简单,就是求两个正整数A和B的和,其中 ...