题意:

  • 给定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的更多相关文章

  1. bzoj2676

    二分概率+矩乘+dp 也是二分概率,然后dp[i][j][k]表示当前到了i,有j条命,下一次的收益是k,然后矩乘转移,但是我自己的似乎wa了,抄了liu_runda的才行,具体不知道为什么 注释的是 ...

  2. 【JZOJ2867】Contra

    description 偶然间,chnlich 发现了他小时候玩过的一个游戏"魂斗罗",于是决定怀旧.但是这是一个奇怪的魂斗罗 MOD. 有 N 个关卡,初始有 Q 条命. 每通过 ...

  3. JavaScript资源大全中文版(Awesome最新版)

    Awesome系列的JavaScript资源整理.awesome-javascript是sorrycc发起维护的 JS 资源列表,内容包括:包管理器.加载器.测试框架.运行器.QA.MVC框架和库.模 ...

  4. JavaScript资源大全中文版(Awesome最新版--转载自张果老师博客)

    JavaScript资源大全中文版(Awesome最新版)   目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框 ...

  5. JavaScript资源大全

    目录 前端MVC 框架和库 包管理器 加载器 打包工具 测试框架 框架 断言 覆盖率 运行器 QA 工具 基于 Node 的 CMS 框架 模板引擎 数据可视化 编辑器 UI 输入 日历 选择 文件上 ...

  6. Scalaz(4)- typeclass:标准类型-Equal,Order,Show,Enum

    Scalaz是由一堆的typeclass组成.每一个typeclass具备自己特殊的功能.用户可以通过随意多态(ad-hoc polymorphism)把这些功能施用在自己定义的类型上.scala这个 ...

  7. 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 ...

  8. English word

    第一部分  通过词缀认识单词 (常用前缀一) 1.a- ①加在单词(形容词)或词根前面,表示"不,无,非" acentric [ə'sentrik] a  无中心的(a+centr ...

  9. C#6.0 VS2015

    https://msdn.microsoft.com/en-us/library/hh156499(v=vs.140).aspx This page lists key feature names f ...

随机推荐

  1. Java 高级应用编程 第一章 工具类

    一.Java API Java API简介 1.API (Application Programming Interface) 应用程序接口 2.Java中的API,就是JDK提供的各种功能的Java ...

  2. c++动态库封装及调用(1、动态库介绍)

    1.一个程序从源文件编译生成可执行文件的步骤: 预编译 -->  编译 -->  汇编 --> 链接 (1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开 ...

  3. 利尔达仿真器加有人CC3200模块USR-C322上电测试

    1. 使用利尔达的CC3200底板仿真器对有人CC3200模块USR-C322进行烧写,测试. 2. 连接的接口,需要连接6根线,如下,供电测试,第一波测试,输入+++回复a,然后在输入a,返回+OK ...

  4. VIN码识别/车架号OCR识别:快速占领汽车后市场数据入口

    大数据时代,企业在数据入口方面的竞争越来越激烈,这种对于入口级的大数据“争夺战”,让很多企业在数据挖掘和收集的技术方面开始加快更新速度. 在当前IT行业激烈竞争环境之下,对于入口产品的控制成为了大数据 ...

  5. leetcode-分割回文子串

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa",&quo ...

  6. token接口的测法

    接口一般都有权限的校验,一般是需要登录后才可以调用 对于接口的认证,一般通过两种方式来实现1.校验用户请求中是否包含某项指定的cookie2.校验用户的请求的header中是否包含某项指定的字段(to ...

  7. JDK源码分析:Byte.java

    Byte是基本数据类型byte的包装类. 1)声明部分: public final class Byte extends Number implements Comparable<Byte> ...

  8. 脚本 script 常用脚本

    目录 remove_all_pyc find_all_links rename_with_slice load_json_without_dupes execution_time benchmark_ ...

  9. Linux 150命令之 文件和目录操作命令 cd pwd cp mv touch

    cd 切换目录 cd 目录 [root@mysql ~]# cd / [root@mysql /]# ls application bin class dev home lib64 media nfs ...

  10. 【转】再谈PHP、Python与Ruby

    原文链接:http://www.nowamagic.net/librarys/veda/detail/2504 一句话总结 简单地总结: 假如你想帮他尽快找个活儿,赚到钱,推荐PHP. 假如你想让他成 ...