首页 > 其他 > 详细

CF601C Kleofá? and the n-thlon 题解

时间:2020-11-09 22:44:36      阅读:39      评论:0      收藏:0      [点我收藏+]

概率DP

\(f(i,j)\) 表示前 \(i\) 项比赛除此人外得分为 \(j\) 的期望人数

有转移:

\(f(i,j)= \frac{1}{m-1} \sum_{k=j-m}^{j-1}f(i-1,k)\times[k\neq j-c_i]\)

很显然的前缀和

\(s_i = \sum_{j=1}^{i} f(i-1,j)\)

转移:

\(f(i,j)=\frac{1}{m-1} (s_{j-1}-s_{j-m-1}-f(i-1,j-c_i)\times[j-m\leq j-c_i \leq j-1])\)

Code:

#include<bits/stdc++.h>
using namespace std;
const int N = 110,M = (int)1e3+7;
int n,m,c[N],C;
double f[N][N*M],s[N*M],g[N*M];
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) scanf("%d",&c[i]),C += c[i];
	for(int i=1;i<=m;++i) if(i!=c[1]) f[1][i] = 1.0;
	for(int i=2;i<=n;++i) {
		for(int j=1;j<=i*m;++j) s[j] = s[j-1]+f[i-1][j];
		for(int j=i;j<=i*m;++j) 
			if(j<=m+1) g[j] = s[j-1] - f[i-1][j-c[i]] * (1<=j-c[i]);
			else g[j] = s[j-1] - s[j-m-1] - f[i-1][j-c[i]] * (j-m<=j-c[i]);
		for(int j=i;j<=i*m;++j) f[i][j] = g[j]/(m-1);
	}
	double ans = 0.0;
	for(int i=1;i<=C-1;++i) ans += f[n][i];
	printf("%.16lf",ans+1.0);
	return 0;
}

CF601C Kleofá? and the n-thlon 题解

原文:https://www.cnblogs.com/Ax-Dea/p/13951175.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!