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 ...
随机推荐
- 2、使用断言(json assertion)
1.假设现在有一个服务端的返回数据(需要测试的)为:HTTP/1.1 200 OK,要测试的响应字段勾选Response Headers,模式匹配规则选择Substring,把该响应断言命名为Http ...
- python 字节码死磕
前言: 如果你跟我一样,对python的字节码感兴趣,想了解python的代码在内存中到底是怎么去运行的,那么你可以继续往下看,如果你是python新手,我建议你移步它处,本文适合有点基础的pyth ...
- 浅谈ArrayList
浅谈ArrayList 废话不多说(事实是不会说),让我们直接进入正题 首先讲一讲最基本的ArrayList的初始化,也就是我们常说的构造函数,ArrayList给我们提供了三种构造方式,我们逐个来查 ...
- Progress笔记
1. iconv -f gbk -t unicode test.tmp > test.csv 如果出现文件数据补全,需要确认在这之前,output是否已经close,如果output to指定了 ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十四)之Type Information
Runtime type information (RTTI) allow you to discover and use type information while a program is ru ...
- 哈密顿绕行世界问题 HDU2181
题目大意都比较简单,用vector存一下图,然后爆搜就可以了. #include<bits/stdc++.h> using namespace std; ; vector<]; bo ...
- JavaScript基础1225
JavaScript函数 1.函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. tip:JavaScript对大小写敏感.关键词function必须是小写,并且必须以与函数名称相同的大小写 ...
- [php] 简单的实现一个错误接管类
自己弄的一个错误接管类: <?php //---------------------------------- // Leephp 错误接管类 // 2017-07-06 // Pengchon ...
- Django文档阅读-Day3
Django文档阅读-Day3 Writing your first Django app, part 3 Overview A view is a "type" of Web p ...
- 在手机和电脑间双向加密传输文件 —— Windows 安装 Kde Connect
2020-04-27 作为 Kde 项目的一部分,Windows 用户可能很少知道它,但它确实存在,而且超棒. Kde Connect 简直了,现在我的手机和 Linux 主机以及 Win 本完全是一 ...