bzoj2676 Contra
题意:
- 给定N,R,Q,S
- 有N个关卡,初始有Q条命,且任意时刻最多只能有Q条命
- 每通过一个关卡,会得到u分和1条命,其中u=min(最近一次连续通过的关数,R)
- 若没有通过这个关卡,将失去一条命,并进入下一个关卡
- 若没有生命或N个关卡均已挑战过一次时,游戏结束,得到的分数为每关得到的分数的总和
- 每条命通过每个关卡的概率为p(0<=p<=1),原先最高分纪录为S
- 求当p至少为多少时,期望获得的总分能够超过最高分。
- 1<=N<=10^8 1<=R<=20 1<=Q<=5,输出保留6位小数
李超WC2013课件里的题(题意就是从课件上粘下来的).
定义f[i][j][k]为当前有i条命,下一次胜利的得分为j(j=min(当前连胜场次+1,R)),还有k个关卡时的期望得分
那么f[i][j][k]=p*(f[min(i+1,Q)][min(j+1,R)][k-1]+j)+(1-p)*f[i-1][1][k-1],边界f[0][j][k]=0
把[i][j]两维展开成一维,就可以通过矩阵乘法来转移了.看起来矩阵会很大会超时,不过我们可以精细地实现程序,因为构造出的转移矩阵里大部分数字是0,我们只需要避免和0相乘就可以过了.(李超在课件里说可以减少无用的状态:连胜次数大于Q的时候生命值不可能小于Q)
然后我写挂了…原因是数组两维大小(5和20)开反了,把大小为5的一维当作大小为20来用,狂WA….
#include<cstdio>
#include<cstring>
int n,r,q;long long s;
int sz;
struct matrix{
double a[][];
matrix(){memset(a,,sizeof(a));}
matrix(int x){memset(a,,sizeof(a));for(int i=;i<sz;++i)a[i][i]=x;}
matrix operator *(const matrix &B)const{
matrix C;
for(int i=;i<sz;++i){
for(int j=;j<sz;++j){
if(a[i][j]<1e-)continue;
for(int k=;k<sz;++k){
if(B.a[j][k]<1e-)continue;
C.a[i][k]+=a[i][j]*B.a[j][k];
}
}
}
return C;
}
}A;
void QuickPow(matrix &A,int x){//printf("%d\n",x);
matrix Ans();
for(;x;x>>=,A=A*A){//printf("...");
if(x&)Ans=Ans*A;
}
A=Ans;
}
int conv[][];//conv[22][7]=>conv[7][22],WA=>AC
bool check(double ans){
sz=r*q+;
int tot=;
for(int i=;i<=q;++i){
for(int j=;j<=r;++j){
conv[i][j]=tot++;
}
}
A=matrix();A.a[tot][tot]=1.0;
for(int i=;i<=q;++i){
for(int j=;j<=r;++j){
A.a[tot][conv[i][j]]+=ans*j;
if(i<q&&j<r){
A.a[conv[i+][j+]][conv[i][j]]+=ans;
}else if(i<q){
A.a[conv[i+][j]][conv[i][j]]+=ans;
}else if(j<r){
A.a[conv[i][j+]][conv[i][j]]+=ans;
}else{
A.a[conv[i][j]][conv[i][j]]+=ans;
}
if(i>){
A.a[conv[i-][]][conv[i][j]]+=(-ans);
}
}
}
// for(int i=0;i<sz;++i){
// for(int j=0;j<sz;++j){
// printf("%.2f ",A.a[i][j]);
// }printf("\n");
// }
//printf("here");
QuickPow(A,n);//printf("done");
double sum=A.a[tot][conv[q][]];//printf("%f\n",sum);
return sum>s;
}
int main(){
scanf("%d%d%d%lld",&n,&r,&q,&s);
if(!check(1.0)){
puts("Impossible.");
}else{//while(1);
double l=,r=1.0;
while(r-l>1e-){//printf("!");
double mid=(l+r)/;
if(check(mid))r=mid;
else l=mid;
}
printf("%.6f\n",(r+l)/);
}
return ;
}
bzoj2676 Contra的更多相关文章
- bzoj2676
二分概率+矩乘+dp 也是二分概率,然后dp[i][j][k]表示当前到了i,有j条命,下一次的收益是k,然后矩乘转移,但是我自己的似乎wa了,抄了liu_runda的才行,具体不知道为什么 注释的是 ...
- 【JZOJ2867】Contra
description 偶然间,chnlich 发现了他小时候玩过的一个游戏"魂斗罗",于是决定怀旧.但是这是一个奇怪的魂斗罗 MOD. 有 N 个关卡,初始有 Q 条命. 每通过 ...
- JavaScript资源大全中文版(Awesome最新版)
Awesome系列的JavaScript资源整理.awesome-javascript是sorrycc发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架.运行器.QA.MVC框架和库.模 ...
- JavaScript资源大全中文版(Awesome最新版--转载自张果老师博客)
JavaScript资源大全中文版(Awesome最新版) 目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框 ...
- JavaScript资源大全
目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框架 模板引擎 数据可视化 编辑器 UI 输入 日历 选择 文件上 ...
- Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum
Scalaz是由一堆的typeclass组成.每一个typeclass具备自己特殊的功能.用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上.scala这个 ...
- 2016.05.03,英语,《Vocabulary Builder》Unit 21
sub, means 'under', as in subway, submarine, substandard. A subject is a person who is under the aut ...
- English word
第一部分 通过词缀认识单词 (常用前缀一) 1.a- ①加在单词(形容词)或词根前面,表示"不,无,非" acentric [ə'sentrik] a 无中心的(a+centr ...
- C#6.0 VS2015
https://msdn.microsoft.com/en-us/library/hh156499(v=vs.140).aspx This page lists key feature names f ...
随机推荐
- 20145226夏艺华《网络对抗》第一次实验拓展:shellcode注入+return-to-libc
20145226夏艺华<网络对抗>第一次实验拓展:shellcode注入+return-to-libc shellcode注入实践 编写shellcode 编写shellcode已经在之前 ...
- Unknown host 'services.gradle.org' 解决方法
报错如下: Unknown host 'services.gradle.org'. You may need to adjust the proxy settings in Gradle. Learn ...
- 问题集 - console.log在IE下不可用
js中添加如下一段代码即可. if(!window.console){ window.console = {}; } if(!window.console.log){ window.console.l ...
- Ubuntu Server 下将HTML页面转换为PNG图片
零.前言 最近做一个网站,需要将网页转换为图片.由于服务器是Ubuntu Server,没有图形界面,所以实现的过程中遇到了很多问题.记录下来备用. 一.安装CutyCapt CutyCapt是一个可 ...
- 使用keytool工具产生带根CA和二级CA的用户证书
使用keytool工具产生带根CA和二级CA的用户证书 1 生成根CA 1.1 生成根CA证书 根CA实际是一张自签CA,自签CA的使用者和颁发者都是它自己.使用下面的命令生成根证书,如果没有指定 ...
- 刚安装的Linux Centos7使用yum安装firefox时提示:cannot find a valid baseurl for repo
出现这个问题是因为yum在安装包的过程中,虽然已经联网,但是没法解析远程包管理库对应的域名,所以我们只需要在网络配置中添加上DNS对应的ip地址即可. 解决参考链接:https://blog.csdn ...
- XSS----payload,绕过,xss小游戏记录
一.XSS 1.原理:攻击者把恶意的脚本代码注入到网页中,等待其他用户浏览 这些网页(或触发其他条件),从而执行其中的恶意代码. 1.xss实例代码: test.html <!DOCTYPE h ...
- JAVA Map 之元素定位,冲突碰撞
基本特性: 维持健值对的集合接口,健不可以重复,每一个健只能映射到一个值. Map替代了原来的虚拟类Directory. Map提供了三种集合视角,keys(KeySet),values(Values ...
- linux学习总结---mysql总结②
函数: 字符串 日期时间 数学 子查询:嵌套查询 1. 做子查询: select sclass from studb where sname='..' 2.select * from studb wh ...
- 关于Filter中ServletRequest强转HttpServletRequest问题
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOE ...