题目链接:https://cn.vjudge.net/problem/UVALive-8138

题意

有一个随机数生成器,输出1~n的整数。

现在已经输出了k个数,问再取几个数才能使取出的所有数的个数至少为2。

注意T<=1e5, \sum k<=1e5

思路

(听说存在公式?理论上说有了转移方程和边界,公式就是存在

概率dp,注意状态的选取。

设i为出现0次的数的个数,j为出现1次的数的个数。

\[\begin{align*}
dp(i, j) &= \frac{i}{n}[dp(i-1, j+1)+1]+\frac{j}{n}[dp(i, j-1)+1]+\frac{n-i-j}{n}[dp(i, j)+1] \\
dp(i, j) &= \frac{i}{i+j}dp(i-1, j+1)+\frac{j}{i+j}dp(i, j-1)+\frac{n}{i+j}
\end{align*}
\]

$ dp(0, 0)=0 $

实际上,n是可以提出来的,这一点还请注意啊。

提交过程

TLE 状态没选对,导致n没提出来
AC

代码

#include <cstdio>
#include <cstring>
const int maxn=3e3+20;
const int INF=0x3f3f3f3f;
double data[maxn][maxn];
int n, k;
double dp(int i, int j){
if (i==0 && j==0) return 0;
if (data[i][j]>0) return data[i][j]; data[i][j]=1;
if (i>=1) data[i][j]+=i*dp(i-1, j+1);
if (j>=1) data[i][j]+=j*dp(i, j-1);
data[i][j]/=(double)(i+j);
return data[i][j];
} int main(void){
int T, tmp; scanf("%d", &T);
while (T--){
scanf("%d%d", &n, &k); int vis[maxn]={0};
for (int i=0; i<k; i++){
scanf("%d", &tmp);
vis[tmp]++;
} int cnt_1=0, cnt_0=0;
for (int i=1; i<=n; i++){
if (vis[i]==1) cnt_1++;
else if (vis[i]==0) cnt_0++;
} printf("%.6f\n", n*dp(cnt_0, cnt_1));
} return 0;
}
Time Memory Length Lang Submitted
449ms None 827 C++ 5.3.0 2018-08-28 13:23:33

UVALive-8138 Number Generator 概率dp+优化的更多相关文章

  1. UVALive 6672 Bonus Cards 概率dp

    题意呢 就是有两种售票方式 一种是icpc 一种是其他方式 icpc抢票成功的概率是其他方式的2倍…… 这时 一个人出现了 他通过内幕知道了两种抢票方式各有多少人 他想知道自己如果用icpc抢票成功的 ...

  2. UVALive 2522 Chocolate(概率DP)

    思路:定义DP方程dp[i][j]标记选到第i个巧克力的时候,桌面上还剩下j个巧克力,状态转移有两个方向,dp[i-1][j-1],dp[i-1]lj+1],分别表示桌面上多了一个和消了一个,乘上需要 ...

  3. uvalive 5721 Activation (概率dp+方程)

    题目链接:http://vjudge.net/problem/viewProblem.action?id=24999 主要思想就是解方程的思想. 二维dp应该很容易想到,就是当前位置加队伍长度. dp ...

  4. CodeForces 602E【概率DP】【树状数组优化】

    题意:有n个人进行m次比赛,每次比赛有一个排名,最后的排名是把所有排名都加起来然后找到比自己的分数绝对小的人数加一就是最终排名. 给了其中一个人的所有比赛的名次.求这个人最终排名的期望. 思路: 渣渣 ...

  5. sdut2623--The number of steps(概率dp第一弹,求期望)

    The number of steps Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 Mary stands in a st ...

  6. 13年山东省赛 The number of steps(概率dp水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud The number of steps Time Limit: 1 Sec  Me ...

  7. hdu 4576(简单概率dp | 矩阵优化)

    艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle?  感觉很不公平.大家算法都一致,因为我程序没有那 ...

  8. 2018.09.27 bzoj2510: 弱题(概率dp+循环矩阵优化)

    传送门 简单概率dp. 显然每次转移的式子可以用一个矩阵表示出来: 这个是循环矩阵. 因此只用维护第一行快速幂一波就行了. 代码: #include<bits/stdc++.h> #def ...

  9. UVALive 6514:Crusher’s Code(概率dp)

    题目链接 https://icpcarchive.ecs.baylor.edu/external/65/6514.pdf 题意:给出n个数(n<8) 求这n个数分别两个程序排成有序时,程序的期望 ...

随机推荐

  1. SIM卡中UCS2编码的三种格式(80,81,82)分析

    网上看到一篇比较好的说ucs2编码的文章,保存一下,原文地址: http://hi.baidu.com/youren4548/blog/item/fa08bd1bf61005058618bf1d.ht ...

  2. js 清空对象\删除对象的属性

    在项目中,有些对象用完后需要重置,下面简单介绍下JS中清除对象的方法.方法如下: 方法一:字面量定义对象 第一步,定义一个空对象并打印出来,代码和效果: 代码: var student = {};co ...

  3. HDU 3432

    水题,就是把一个矩形平分. 题意:一个wid*hei的矩形,过底边上的一点(dor,0)做m-1条射线,把这个矩形的面积平均分成m份,求这些射线和矩形的另外一个交点. 直接枚举,然而求三角形高底移动坐 ...

  4. Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数

    Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数 学习了:http://www.importnew.com/14958.html 膜拜一下 源码膜拜: Threa ...

  5. 【网络协议】ICMP协议、Ping、Traceroute

        ICMP协议 ICMP常常被觉得是IP层的一个组成部分,它是网络层的一个协议.它传递差错报文以及其它须要注意的信息.ICMP报文通常被IP层或更高层(TCP.UDP等)使用,它是在IP数据报内 ...

  6. HTTP详解工作原理

    1. HTTP简介 HTTP协议(HyperText Transfer Protocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传送协议.它可以使浏览器更加高效,使网络传输减少. ...

  7. 2016.04.03,英语,《Vocabulary Builder》Unit 09

    her/hes:  from the Latin verb haerere, means 'to stick' or 'to get stuck'. adhesive means 'sticking' ...

  8. servlet 处理过程

    刚才花了一个小时找 servlet 的一个错误.终于找出来了,也大概明确 tomcat server对请求的处理顺序.以下做简单总结: 浏览器发送请求,传给 tomcat 在此请求地址指向的文件中定义 ...

  9. luogu1896 [SCOI2005]互不侵犯 状压DP

    题目大意 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.( 1 <=N <=9, 0 ...

  10. Constructing Roads --hdoj

    Constructing Roads Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) ...