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 ...
随机推荐
- 你的APK安全吗?来WeTest免费测!
腾讯安全联合实验室就曾在<2018上半年互联网黑产研究报告>指出,移动端黑产规模宏大,恶意推广日均影响用户超过千万. 尤其在网络强相关的APP流行年代,当APP应用客户端上传与获取信息,大 ...
- php单例模式和工厂模式
单例模式:防止重复实例化,避免大量的new操作,减少消耗系统和内存的资源,使得有且仅有一个实例对象 header("Content-type: text/html; charset=utf- ...
- web自动化测试框架总结
web自动化测试框架总结: https://www.processon.com/mindmap/5bdab924e4b0878bf41e9e09
- Windowserver2012部署always on
1.首先,安装域环境 IP设置 域服务安装 如果建立域配置时出现 administrator账户密码不符合要求错误: cmd运行命令: net user administrator /password ...
- TPO-13 C1 Understand the assignment in psychology course
TPO-13 C1 Understand the assignment in psychology course 第 1 段 1.listen to a conversation between a ...
- Unity Lighting - Lighting overview 照明概述
Lighting overview 照明概述 In order to calculate the shading of a 3D object, Unity needs to know the ...
- Java开发工程师(Web方向) - 01.Java Web开发入门 - 第1章.Web应用开发概述
第1章--Web应用开发概述 Web应用开发概述 浏览器-服务器架构(BS-architecture) browser/ App ---- request ----> server ...
- 51单片机实现定时器00H-FFH、定时器000-255
#include< reg51.h> #define uint unsigned int #define uchar unsigned char sfr P0M0 = 0x94; sfr ...
- ionic 日期插件学习
<ion-header> <ion-navbar> <ion-title> DateTime </ion-title> </ion-navbar& ...
- 零基础自学人工智能,看这些资料就够了(300G资料免费送)
为什么有今天这篇? 首先,标题不要太相信,哈哈哈. 本公众号之前已经就人工智能学习的路径.学习方法.经典学习视频等做过完整说明.但是鉴于每个人的基础不同,可能需要额外的学习资料进行辅助.特此,向大家免 ...