码迷,mamicode.com
首页 > 其他好文 > 详细

CF235 Let's Play Osu![dp+概率]

时间:2014-08-23 17:45:31      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   ar   2014   

题意:

给n个位置,给出1-n上每个位置出现O的概率pi,记分规则如下,连续的x个O记为x^2分,求和,如 XXOOOXOXOOXX得分为bubuko.com,布布扣

求得分的期望



思考一下,我们能比较容易地得出O(n^2)的方法

令dp[i]为前i的得分期望

那么

bubuko.com,布布扣

显然这题

bubuko.com,布布扣

考虑一下变换记分的方式

我们有

bubuko.com,布布扣

那么记分方式就变为

一段连续的O,有多少对O×2+O的个数

一对O可以贡献2分


现在得分来源变为两个地方

一对O(2分),和单个O(1分)


我们知道

期望=概率×收益

我们找到每个对O的概率×2

再找到单个O×出现概率

求和即是期望得分


对于某一个点i

有(1,i) (2,i) (3,i) (4,i)...(i-1,i)这些对O,每个概率即是从左到右连乘,比如bubuko.com,布布扣

令这些概率和为dp[i],即bubuko.com,布布扣

这样我们有递推关系

对i+1点来说,bubuko.com,布布扣


dp求和即是所有对O出现的概率之和×2

+

单个O出现的概率×1

求得的即是期望分数


#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int NN=111111;
double f[NN];
double dp[NN];
int main(){
#ifndef ONLINE_JUDGE
	freopen("/home/rainto96/in.txt","r",stdin);
#endif

	int n;scanf("%d",&n);
	double sum=0;
	for(int i=1;i<=n;i++){
		//cin>>f[i];
		scanf("%lf",&f[i]);
		sum+=f[i];
	}
	double ansum=0;
	for(int i=2;i<=n;i++){
		dp[i]=(dp[i-1]+f[i-1])*f[i];
		ansum+=dp[i];
	}
	printf("%f\n",ansum*2.0+sum);
}


CF235 Let's Play Osu![dp+概率]

标签:style   blog   http   color   os   io   for   ar   2014   

原文地址:http://blog.csdn.net/u011775691/article/details/38779441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!