bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy
这俩题太像了
Description
某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(
我们来简化一下这个游戏的规则
有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连续a个comb就有aa分,comb就是极大的连续o。
比如ooxxxxooooxxx,分数就是22+4*4=4+16=20。
Sevenkplus闲的慌就看他打了一盘,有些地方跟运气无关要么是o要么是x,有些地方o或者x各有50%的可能性,用?号来表示。
比如oo?xx就是一个可能的输入。
那么WJMZBMR这场osu的期望得分是多少呢?
比如oo?xx的话,?是o的话就是oooxx => 9,是x的话就是ooxxx => 4
期望自然就是(4+9)/2 =6.5了
Input
第一行一个整数n,表示点击的个数
接下来一个字符串,每个字符都是ox?中的一个
Output
一行一个浮点数表示答案
\(n\leq 300000\)
一开始想对每一块连续的确定的\(o\)来维护,但显然不行
由于答案是长度的平方,所以可以先维护一个期望长度
\(len_i\)表示以\(i\)结尾的期望长度
你显然,如果当前是\(o,len_i=len_{i-1}+1\),当前为\(x,len_i=0\)
如果是不确定,又因为概率是二分之一,那期望就是上面两种情况加起来除以二,\(len_i=\dfrac{len_{i-1}+1}{2}\)
然后很容易观察到的是\((x+1)^2=x^2+2x+1\)
所以可以由这个式子从长度推到答案
设\(f_i\)为\(1\)到\(i\)位答案的期望,这里和刚才\(len\)不同
还是分三种情况讨论
已经确定的两种情况都很简单,是\(o\)就\(f_i=f_{i-1}+2len_{i-1}+1\),是\(x\)就\(f_i=f_{i-1}\)
因为这里是统计的\(1\)到\(i\)的期望答案,所以也要把前面的期望累加上
如果不确定,就是\(f_i\)有一半的几率能加上\(2len_{i-1}+1\),所以\(f_o=f_{i-1}+\dfrac{2len_{i-1}+1}{2}\)
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n;
char s[300006];
double len[300006],f[300006];//len是以i结尾的期望长度
int main(){
n=read();
std::scanf("%s",s+1);
for(reg int i=1;i<=n;i++){
if(s[i]=='o'){
len[i]=len[i-1]+1;
f[i]=len[i-1]*2+1+f[i-1];
}
else if(s[i]=='x'){
len[i]=0;f[i]=f[i-1];
}
else{
len[i]=(len[i-1]+1)/2;
f[i]=(len[i-1]*2+1)/2+f[i-1];
}
}
std::printf("%.4lf",f[n]);
return 0;
}
bzoj4318 OSU!
这个就是前面那个的升级版
Description
osu 是一款群众喜闻乐见的休闲软件。
我们可以把osu的规则简化与改编成以下的样子:
一共有n次操作,每次操作只有成功与失败之分,成功对应1,失败对应0,n次操作对应为1个长度为n的01串。在这个串中连续的 X个1可以贡献X^3 的分数,这x个1不能被其他连续的1所包含(也就是极长的一串1,具体见样例解释)
现在给出n,以及每个操作的成功率,请你输出期望分数,输出四舍五入后保留1位小数。
Input
第一行有一个正整数n,表示操作个数。接下去n行每行有一个[0,1]之间的实数,表示每个操作的成功率。
Output
只有一个实数,表示答案。答案四舍五入后保留1位小数。
\(n\leq 100000\)
还是用之前的思路,维护一个长度
但是这次转移就是\(len_i=(len_{i-1}+1)\cdot p\)了,因为它有\(p\)的概率能加一,而剩下\(1-p\)的几率变成0
由于\((x+1)^3=x^3+3x^2+3x+1\),所以还要再维护一个长度平方的期望才能得到答案
因为期望的平方不一定等于平方的期望,这是看了别人blog才知道的,并不会证
长度平方的期望和刚才差不多,但并不完全一样,这只算上以\(i\)结尾的长度的平方
算答案就照搬这个式子然后乘上\(p\)就行
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define reg register
#define EN std::puts("")
#define LL long long
inline int read(){
int x=0,y=1;
char c=std::getchar();
while(c<'0'||c>'9'){if(c=='-') y=0;c=std::getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=std::getchar();}
return y?x:-x;
}
int n;
double f[100006],sqr[100006],len[100006];
int main(){
n=read();
reg double p;
for(reg int i=1;i<=n;i++){
std::scanf("%lf",&p);
len[i]=(len[i-1]+1)*p;
sqr[i]=(sqr[i-1]+len[i-1]*2+1)*p;
f[i]=f[i-1]+(3*sqr[i-1]+3*len[i-1]+1)*p;
}
// for(reg int i=1;i<=n;i++) std::printf("%.3lf %.3lf %.3lf\n",len[i],sqr[i],f[i]);
std::printf("%.1lf",f[n]);
return 0;
}
其实这两段代码中的数组是可以省掉的,只记录一个之前以为的信息
bzoj4318 OSU!和bzoj 3450 Tyvj1952 Easy的更多相关文章
- Bzoj 3450: Tyvj1952 Easy (期望)
Bzoj 3450: Tyvj1952 Easy 这里放上题面,毕竟是个权限题(洛谷貌似有题,忘记叫什么了) Time Limit: 10 Sec Memory Limit: 128 MB Submi ...
- Bzoj 3450: Tyvj1952 Easy 期望/概率,动态规划
3450: Tyvj1952 Easy Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 431 Solved: 325[Submit][Status] ...
- bzoj 3450 Tyvj1952 Easy (概率dp)
3450: Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是o,失败 ...
- 【概率】BZOJ 3450:Tyvj1952 Easy
Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则 有n次点击要做,成功了就是o,失败了就是x,分数是按comb计算的,连 ...
- bzoj 3450: Tyvj1952 Easy
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 411 Solved: 309[Submit][Status][Discuss] Descriptio ...
- BZOJ 3450 Tyvj1952 Easy(期望)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3450 [题目大意] 给出一个字符串,包含o,x和?,一个字符串的得分为 每段连续的o的 ...
- BZOJ 3450: Tyvj1952 Easy 数学期望
Code: #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) ...
- BZOJ 3450: Tyvj1952 Easy [DP 概率]
传送门 题意:$ox?$组成的序列,$?$等概率为$o\ or\ x$,得分为连续的$o$的长度的平方和,求期望得分 一开始没想出来,原因在于不知道如何记录长度 其实我们同时求得分和长度的期望就好了 ...
- BZOJ 3450 Tyvj1952 Easy ——期望DP
维护$x$和$x^2$的期望递推即可 #include <map> #include <ctime> #include <cmath> #include <q ...
随机推荐
- javascript 入门 之select2获取远程数据
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"/> <meta lan ...
- 列表推导式和seed()的理解
Table of Contents generated with DocToc 列表推导式和seed()的理解 对seed()的理解 列表推导式 第一种用法 第二种用法 列表推导式和seed()的理解 ...
- c++缓冲区 vBufferChar.hpp
//vbuffer_char.hpp //vov #ifndef V_BUFFER_CHAR_HPP #define V_BUFFER_CHAR_HPP #include <iostream&g ...
- ActiveMQ支持的消息协议
ActiveMQ支持哪些协议 ActiveMQ支持多种协议传输和传输方式,允许客户端使用多种协议连接ActiveMQ支持的协议:AUTO,OpenWire,AMQP,Stomp,MQTT等Active ...
- python超实用的30 个简短的代码片段(三)
Python是目前最流行的语言之一,它在数据科学.机器学习.web开发.脚本编写.自动化方面被许多人广泛使用. 它的简单和易用性造就了它如此流行的原因. 如果你正在阅读本文,那么你或多或少已经使用过P ...
- stand up meeting 1/8/2016 & weekend 1/9/2016~1/10/2016 && sprint2扫尾
part 组员 工作 工作耗时/h 明日计划 工作耗时/h UI 冯晓云 跑通打印机功能,尝试与pdf读取部分结合 6 查漏补缺, ...
- 功能测试--聊天功能测试&微信聊天
微信聊天功能测试 发送对象 普通用户.公众号.群.其他特殊主体 衍生功能 转发.语音转文字.删除等 消息发送 单聊.群聊.语音.文字.图片.表情.链接.字符及长度 消息管理 发布通知.接受通知.发文件 ...
- 数值分析实验之曲线最小二乘拟合含有噪声扰动(python实现)
一.实验目的 掌握最小二乘法拟合离散数据,多项式函数形式拟合曲线以及可以其他可以通过变量变换转化为多项式的拟合曲线目前待实现功能: 1. 最小二乘法的基本实现. 2. 用不同数据量,不同参数,不同的多 ...
- c++四舍五入函数round()
其实c++自身是没有四舍五入函数round()的,若果你要用到的话,可以自己写一个round(),不过要用到floor()和ceil这两个函数如下: #include<iostream> ...
- 微信自动关闭内置浏览器页面,返回公众号窗口 WeixinJSBridge.call('closeWindow')
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...