首页 > 其他分享 >题解: CF768D Jon and Orbs

题解: CF768D Jon and Orbs

时间:2023-10-10 22:24:46浏览次数:43  
标签:概率 frac 定义 题解 Orbs 天选 CF768D 物品

题解: CF768D Jon and Orbs

一句话体面:有k种不同的物品,每天等概率任取一种(不一定是新的种类)。q组询问,每组给出一个p,问取完这k件物品的概率不小于\(\frac{p}{2000}\)的最小天数

不用说,肯定是概率DP了

1.定义 :\(f_{i,j}\) 表示前\(i\)天选取了 \(j\) 种物品的概率(\(P.S.\)该定义不是最终的准确定义!请耐心往下读!)

则分两类情况转换:

(1)前\(i-1\)天已经选了\(j\)种物品了,第\(i\)天选了一个旧的,则有

\[f_{i,j}+=f_{i-1,j}*\frac{j}{k} \]

(2)前\(i-1\)天选了\(j-1\)种物品,第\(i\)天选了一个新的,则有

\[f_{i,j}+=f_{i-1,j-1}*\frac{k-(j-1)}{k} \]

整合一下两种情况,则有

\[f_{i,j}=f_{i-1,j}*\frac{j}{k}+f_{i-1,j-1}*\frac{k-(j-1)}{k} \]

2.初始值:(\(P.S.\)因为初始值的问题我调了2个多小时!!!大家一定要想清楚再下笔!)

一开始我是这么写的:

F(i,1,M) f[i][1]=1;

一看别人的题解发现是这样的:

f[0][0]=1;

当场感觉不妙,再仔细想了想有道理:前\(0\)天选\(0\)种的概率肯定就是\(1\)啊,那前\(i\)天不是至少会选到一种吗,概率为什么不是1???

回到定义去找问题:发现“选了\(j\)种物品”其实不够准确,前\(i\)天选了1种物品,是每一天只需要随便选一种就行了吗?

再三思索后终于发现并不是这样的!物品种类不能多也不能少,必须刚好是\(1\)种!!!,所以将定义说清楚了应该是: 前\(i\)天只选了 \(j\) 种物品的概率

所以得到如下边界:

\[f_{i,1}=f_{i-1,1}*\frac{1}{k}(i\geqslant2,f_{1,1}=\frac{1}{k}) \]

然后恍然大悟别人写的是对的,令\(f_{0,0}=1\),然后用上面推出的动态转移方程推得出\(f_{1,1}=\frac{1}{k}\)

所以也可以把我丑的一批的初始化改成这样

f[1][1]=1; F(i,2,M) f[1][i]=f[1][i-1]/k;

\(Code:\)

#include<bits/stdc++.h>
#define ld long double
#define ri register int
#define F(i,l,r) for(ri i=l;i<=r;++i)
using namespace std;
const int N=1005,M=1e4;
ld tmp,f[M+5][N],p;//f[i][j]:前i天只取了j种物品的概率 
int k,q,w;
int main(){;
	scanf("%d%d",&k,&q);
	f[0][0]=1;//f[1][1]=1; F(i,2,M) f[1][i]=f[1][i-1]/k;
	F(j,1,k) F(i,1,M) f[i][j]=(f[i-1][j]*(ld)j/k+f[i-1][j-1]*(ld)(k-j+1)/k);
	while(q--){
		scanf("%Lf",&p); p*=0.0005; w=1;//注意p的类型不能是int,因为要乘0.0005 
		while(f[w][k]<p) ++w;
		//暴力搜就可以没必要二分查,总时间复杂度不超过M*Q,才1e7(注:M的范围是算出来的,当k=1000,p=1000时,w最大也才7000多一点点) 
		printf("%d\n",w);
	}
	return 0;
}

3.总结:方程并不难推,关键是想清楚初始化!!!

END~

标签:概率,frac,定义,题解,Orbs,天选,CF768D,物品
From: https://www.cnblogs.com/superl61/p/17755887.html

相关文章

  • 题解 DIFERENC - DIFERENCIJA
    题目描述给出一个长度为\(n\)的序列\(a_i\),求出下列式子的值:\[\sum_{i=1}^n\sum_{j=i}^n(\max\limits_{i\lek\lej}a_k-\min\limits_{i\lek\lej}a_k)\]即定义一个子序列的权值为序列内最大值与最小值的差。求出所有连续子序列的权值和。具体思路暴力思路很好......
  • p4801题解
    解题思路:确实是一道很好的贪心,但由于加上了水这个影响因素,使题目复杂度上升了不少。(考虑的东西多了嘛)输个入。对饼干温度无脑排序。求最小值。求最大值(用双指针做,后面会讲)。解题过程:先输入(这个步骤就不用我讲了)inta[1000005];longlongn,ws;longlongmin......
  • 洛谷P4158 [SCOI2009] 粉刷匠 题解
    所有的\(DP\),只要式子一推出来(不管复杂度),那就很简单了,因为优化是成千上万种的……思路1:我们考虑设\(f[i][j][k]\)表示:当前\(DP\)到第\(i\)块木板的第\(j\)个位置,共涂了\(k\)次,所能获得的最大收益。因为还要枚举当前这次涂是从哪到哪的,因此复杂度为\(O(NM^2T)\),实......
  • 洛谷P3300 [SDOI2013] 城市规划 题解
    [SDOI2013]城市规划题意:给你一个\(6\timesn\)的网格题,单点修改,询问区间联通块数,\(n\le10^5\)。解:看起来就很显然的一道题......线段树每个点用一个ufs维护连通性;我为了方便思考把图转成横着的了。写起来真是毒瘤......重点在于:\(\bullet\)1、建立叶节点。\(\bull......
  • 【ABC320C】题解
    AtCoderBeginnerContest320ProblemC-SlotStrategy2(Easy)题解题目简述给定\(3\)个长度为\(m\)的转盘,转动过后三个转盘分别可以在不同的时间停下,求停下时所有转盘都显示相同数字的最小时间。思路由于这题\(m\le100\),数据较水,所以可以先把每个数列都复制\(......
  • 【ABC320D】题解
    AtCoderBeginnerContest320ProblemD-RelativePosition题解题目保证不矛盾,就可以直接vector建图,然后dfs一遍,边权为\((w_x,w_y)\)表示坐标的差,从\(u=1\)开始搜索,设点\(u,v\)有一条无向边,\(v_x=u_x+w_x,v_y=u_y+w_y\),最后如果没有被标记过的话(也就是没有......
  • 【题解】Fibonacci-ish II
    传送门题目分析根据题目范围\(n\le30000\)并且此题可以离线维护这个很恶心的东西,所以我们考虑莫队。由于要求访问到任意一个区间都要求知道它有序之后的序列,所以这个东西可以用权值线段树维护。因此,此题正解是莫队+权值线段树。我们分类讨论一下加上一个数,删除一个数对答案......
  • 题解 P3894【[GDOI2014] 传送】
    难倒不难,128MB的空间限制快恶心死我了。我们设\(d_{u_0,u_1}\)表示到节点\((u_0,u_1)\)距离最近的叶子的距离,这个可以很容易换根DP求出。设\(p_{u_0}\)表示树\(u_0\)中距离最近的两个叶子的距离。设\(dis(u_0,u_1,v_0,v_1)\)(\(u_0=v_0\))表示树中两个节点\(u_1\)和......
  • 【ABC322C】题解
    AtCoderBeginnerContest322ProblemC-Festival题解Meaning-题意简述给定\(N\)和\(M\),还有\(M\)个正整数\(a_1\sima_n\),对于每个\(i\len\),求出\(a\)中第一个大于等于\(i\)的整数和\(i\)的差。Solution-题解思路题目保证\(a\)数组单增,所以就可......
  • 【LG-P7617】题解
    题解思路不用关心每个数的每一位是什么、哪几位相同,我们只需记录每个数出现了哪几个数字,可以使用类似于状态压缩的思想记录每个数的状压形式,比如一个数为\((4)_{10}\),那么他的状态压缩形式为\((00001)_2\)。当两个数在状态压缩表示下有一位相同,我们就认为这两个数是一对,每个......