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 ...
随机推荐
- jQuery File Upload 文件上传插件使用一 (最小安装 基本版)
jQuery File Upload 是一款非常强大的文件上传处理插件,支持多文件上传,拖拽上传,进度条,文件验证及图片音视频预览,跨域上传等等. 可以说你能想到的功能它都有.你没想到的功能它也有.. ...
- JQuery表单验证插件
使用jQuery的validate插件实现一个简单的表单验证 <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- tomcat6升级到7时400问题,以及url带有汉字时出错。
tomcat6升级到7时400问题: 在文件catalina.properties后加入tomcat.util.http.parser.HttpParser.requestTargetAllow=|. ...
- C 关键字 标示符 注释
一 关键字 1. 什么是关键字 关键字就是C语言提供的有特殊含义的符号 也叫做"保留字" C语言一共提供了32个关键字 这些关键字都被C语言赋予了特殊含义 auto double ...
- Objective-C 第一个小程序
示例一 (类似C) //1.代码编写 //跟C语言一样,OC程序的入口依然是main函数,只不过写到一个.m文件中.比如这里写到一个main.m文件中(文件名可以是中文) #include <s ...
- 前端开发工程师 - 03.DOM编程艺术 - 第1章.基础篇(上)
第1章.基础篇(上) Abstract:文档树.节点操作.属性操作.样式操作.事件 DOM (Document Object Model) - 文档对象模型 以对象的方式来表示对应的html,它有一系 ...
- Python 的非正式介绍
在下面的例子中,通过提示符 (>>> 与 ...) 的出现与否来区分输入和输出:如果你想复现这些例子,当提示符出现后,你必须在提示符后键入例子中的每一个词:不以提示符开头的那些行是解 ...
- 使用pycharm软件配置数据库可视化
必须品: pycharm软件,专业版最好自带就有,社区版就需要安装下插件. 专业版直接会在右边的编辑框浮动,直接点开就可以配置. 如图所示,点开就可以配置相应的数据库, 点开配置完毕就可以使用了. 还 ...
- javascript常用对象方法
concat:连接产生一个新数组 [1,2].concat([3,4]) >> [1, 2, 3, 4] filter:返回符合条件的一个新数组 [1,2,3,4,5].filte ...
- 【Python 开发】第二篇 :Python安装
一.python3.x安装 1)由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到. 官网:https://www.python.o ...