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 ...
随机推荐
- 北京Uber优步司机奖励政策(高峰期5倍奖励)(12月7日)
用户组:人民优步及电动车(适用于12月7日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http ...
- 优步UBER司机高峰小时保底奖励
高峰小时保底奖励 (此奖励仅针对6月1日及以后激活的优步车主): 得到“高峰小时保底”的前提为: 1. 在规定高峰时间段内(不得跨段计算),任意一小时内至少完成一单: 2. 在规定高峰时间段内,任 ...
- Hive窗口函数之LAG、LEAD、FIRST_VALUE、LAST_VALUE的用法
一.创建表: create table windows_ss ( polno string, eff_date string, userno string ) ROW FORMAT DELIMITED ...
- springboot shiro没有注解解决方案
颓废的悠然 springboot shiro开启注释 shiroconfiguration中增加 1 2 3 4 5 6 7 @Bean public AuthorizationAttri ...
- Typeahead的使用总结
Typeahead是Bootstrap的自动补全JS插件. 最近项目中用到,总结一下. 与autocomplish类似,通过ajax实现,实现流程是前台输入关键字,后台根据关键字查询出信息,构造jso ...
- Tomcat - 远程调试配置
复制一份startup.bat,更名为“startup-debug”. 替换内容如下: call "%EXECUTABLE%" start %CMD_LINE_ARGS% 替换为 ...
- Java String 字符串类细节探秘
一. 字符串基本知识要点 字符串类型String是Java中最常用的引用类型.我们在使用Java字符串的时候,通常会采用两种初始化的方式:1. String str = "Hello Wor ...
- 拼接index
import MySQLdb import sys db = MySQLdb.connect(host="127.0.0.1", # your host, usually loca ...
- 「日常训练&知识学习」树的直径(POJ-1849,Two)
题意 一个城市由节点和连接节点的街道组成,街道是双向的. 此刻大雪覆盖了这个城市,市长确定了一些街道要将它们清扫干净,这些街道保证所有的节点可以通过它们连通而且街道数目尽可能小. 现有两台相同的扫雪机 ...
- Git一分钟系列--快速安装git客户端
在项目开发过程中,几乎所有公司都会用到版本控制工具来管理自己的项目资源文件,比如Git,SVN. 什么是svn? 版本控制软件,通过svn来实现版本控制首先需要搭建一个服务器,在服务器上创建仓库保存项 ...