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 ...
随机推荐
- Serverless无服务器云函数入门唠叨
B站录了个视频: https://www.bilibili.com/video/av59020925/
- Python操作rabbitmq系列(一)
从本文开始,接下来的内容,我们将讨论rabbitmq的相关功能.我的这些文章,最终是要实现一个项目(具体是什么暂不透露).前面每一篇,都是在为这个系统做准备.rabbitmq,是我们这个项目的关键部分 ...
- 最长回文子窜O(N)
字符窜同构的性质:同构字符窜拥有最小和最大的表示方法: 最长回文子窜: 1.首先暴力法:(n三方) 枚举每个起点和终点,然后单向扫描判断是不是回文子窜: 2.中心扩散法,(N方) 枚举每个中点,向外扩 ...
- 选择IT行业的自我心得,希望能帮助到各位!(三)失败篇
可能很多小伙伴会说人人创业岂不是人人都能成功,岂不是人人都能成功,是不是每个人都能开上保时捷,法拉利泡着美女,很多人也会说你看他看她多轻松,做个IT一样就赚钱赚钱了. 那么又有多少人能理解到你的心酸了 ...
- 也谈如何实现bind、apply、call
也谈如何实现bind.apply.call 我们知道,JavaScript的bind.apply.call是三个非常重要的方法.bind可以返回固定this.固定参数的函数包装:apply和call可 ...
- 代码质量管理 SonarQube 系列之 安装
简介 SonarQube 是一个开源的代码质量管理系统. 功能介绍: 15种语言的静态代码分析 Java.JavaScript.C#.TypeScript.Kotlin.Ruby.Go.Scala.F ...
- util.Date与sql.Date的异同以及相互转换
Java中有两个Date类 一个是java.util.Date通常情况下用它获取当前时间或构造时间 另一个是java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分 两个类型的时间 ...
- Pet BFS
一天早上小明醒来时发现他的宠物仓鼠不见了. 他在房间寻找但是没找到仓鼠. 他想用奶酪诱饵去找回仓鼠. 他把奶酪诱饵放在房间并且等待了好几天. 但是可怜的小明除了老鼠和蟑螂没见到任何东西. 他找到学校的 ...
- java 一维数组的总结笔记
数组 1. 一位数组的声明方式 type[] array Name 或 type arrayName[];(推荐使用第二种) 错误的声明方式 //int[5] intErrorArray;错误的 // ...
- 01、Hibernate安装配置
1.查看你的Eclipse的版本:Help | About Eclipse Version: 2018-12 (4.10.0) 2.HibernateTools的下载地址为:http:// ...