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 ...
随机推荐
- Python 1基础语法二(标识符、关键字、变量和字符串)
一.标识符 标识符就是程序员自己命名的变量名.名字需要有见名知义的效果,不要随意起名 :比如 a=1 a是个变量,a这个变量名属于标识符 1 company = '小米 2 employeeNum = ...
- Jmeter使用Websocket插件测试SingalR,外加还有阿里云PTS的Jmeter原生测试爬坑日志。
题外话:距离我的上一篇博客已经过去7年多了,我实在是个不务正业的程序员,遇到测试方面的东西总想分享一下,因为可用的资料实在太少了(包括国外的资料). 本人不喜欢授人以鱼,所以不会直接给出问题和解决方案 ...
- matplotlib TransformWrapper
2020-04-09 23:26:53 --Edit by yangray TransformWrapper 是Transform的子类, 支持在运行中替掉一个变换(可以是不同类型, 但维度必须相同) ...
- 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 ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(十一)之Holding Your Objects
To solve the general programming problem, you need to create any number of objects, anytime, anywher ...
- Thinking in Java,Fourth Edition(Java 编程思想,第四版)学习笔记(七)之Access Control
Access control ( or implementation hiding) is about "not getting it right the first time." ...
- 数据挖掘入门系列教程(九)之基于sklearn的SVM使用
目录 介绍 基于SVM对MINIST数据集进行分类 使用SVM SVM分析垃圾邮件 加载数据集 分词 构建词云 构建数据集 进行训练 交叉验证 炼丹术 总结 参考 介绍 在上一篇博客:数据挖掘入门系列 ...
- powershell提示无法将“”项识别
解决: 完成! 解释: 权限问题.Powershell脚本的4种执行权限介绍,Windows默认不允许任何脚本运行,我们可以使用"Set-ExecutionPolicy"cmdle ...
- 掌握游戏开发中类Message、Handle
1. 实验目的 1. 自主地设计图形界面 2. 掌握消息类Message的应用 3. 掌握消息处理类Handle的应用 4. 掌握子线程中中更新UI界面的方法 2. 实验内容 1. 在主界面设置 ...
- Java 多线程 -- lambda 表达式推导
jdk 8 开始 java 引入了lambda 表达式. lambda适用场景: 1.接口或父类 2.接口或父类只有一个方法 我们从多线程写法来推导一下: 1.外部类写法: package com.x ...