description

  偶然间,chnlich 发现了他小时候玩过的一个游戏“魂斗罗”,于是决定怀旧。但是这是一个奇怪的魂斗罗 MOD。

  有 N 个关卡,初始有 Q 条命。

  每通过一个关卡,会得到 u 分和1条命,生命上限为 Q。其中 u=min(最近一次连续通过的关数,R)。

  若没有通过这个关卡,将会失去1条命,并进入下一个关卡。

  当没有生命或没有未挑战过的关卡时,游戏结束,得到的分数为每关得到的分数的总和。

  由于 chnlich 好久不玩这个游戏了,每条命通过每个关卡的概率均为p(0<=p<=1),原先 chnlich 的最高分纪录是 S。

  现在 chnlich 想要知道,当 p 至少为多少时,chnlich 期望获得的总分数能够超过原先的最高分。

analysis

  • 很好的二分\(+\)矩乘\(+DP\)题

  • 由题解可得\(50pts\)的\(DP\)方程

\[g[i+1][min(j+1,R)][min(k+1),Q]+=g[i][j][k]*p
\]

\[g[i+1][0][k-1]+=g[i][j][k]*(1-p)
\]

\[Answer+=g[i][j][k]*p*(j+1)
\]

  • 二分一个最小可能的\(p\),用矩乘判断是否可行

  • 对于每一种积分\(x\)命\(y\)条的状态,用不同的数字表示来压状态

  • 可以知道当积分\(≥q\)时(连赢至少\(q\)次),命一定为\(q\)条,这样可以省去很多状态

  • 压完状态之后,就只有\(30\)种左右的状态,可以矩乘快速幂

  • 具体就是把按照方程每种状态转移到其他状态的矩阵位置加上贡献\(p,1-p\)或\(p*(j+1)\)

  • 注意那个\(Answer\)由所有的情况累加到最终状态,即为积分\(0\)命\(0\)条的情况

  • 判断最终矩阵第起始状态行(积分\(0\)命\(q\)条)第终止状态列(积分\(0\)命\(0\)条)的值是否大于\(s\)即可

  • 下次遇到矩乘题目,要认真想想\(DP\),不要被矩阵怎么推给卡住


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 40
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll statu[10][50];
ll n,m,r,q,s; struct matrix
{
double f[MAXN][MAXN];
matrix(){memset(f,0,sizeof(f));}
};
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll max(ll x,ll y){return x>y?x:y;}
inline ll min(ll x,ll y){return x<y?x:y;}
inline matrix operator*(matrix a,matrix b)
{
matrix c;
fo(i,1,n)fo(j,1,n)fo(k,1,n)c.f[i][j]+=a.f[i][k]*b.f[k][j];
return c;
}
inline matrix pow(matrix x,ll y)
{
matrix z;
fo(i,1,n)z.f[i][i]=1;
if (y==0)return z;
while (y)
{
if (y&1)z=z*x;
x=x*x,y>>=1;
}
return z;
}
inline bool judge(double p)
{
matrix a;n=0;
fo(i,0,q)//statu[i][j]表示剩i条命有j积分的情况
{
ll tmp=i==q?r:min(i-1,r);
fo(j,0,max(tmp,0))statu[i][j]=++n;
}
a.f[1][1]=1;
fo(i,1,q)
{
ll tmp=i==q?r:min(i-1,r);
fo(j,0,max(tmp,0))
{
ll x=statu[i][j],y=statu[i-1][0],z=statu[min(i+1,q)][min(j+1,r)];
if (i>1)a.f[x][y]=1-p;a.f[x][z]=p,a.f[x][statu[0][0]]=p*min(j+1,r);
}
}
matrix b=pow(a,m);
return b.f[statu[q][0]][statu[0][0]]>s;
}
int main()
{
freopen("T2.in","r",stdin);
m=read(),r=read(),q=read(),s=read();
if (!judge(1)){printf("Impossible.\n");return 0;}
ll l=0,r=10000000,tmp=r,mid=(l+r)>>1;
while (l<=r)
{
mid=(l+r)>>1;
if (judge(1.0*mid/tmp))r=mid-1;else l=mid+1;
}
printf("%.6lf\n",1.0*l/tmp);
return 0;
}

【JZOJ2867】Contra的更多相关文章

  1. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  2. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  3. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  4. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  5. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  6. Python高手之路【三】python基础之函数

    基本数据类型补充: set 是一个无序且不重复的元素集合 class set(object): """ set() -> new empty set object ...

  7. Python高手之路【一】初识python

    Python简介 1:Python的创始人 Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种解释型.面向对象.动态数据类型的高级程序设计语言,由荷兰人Guido ...

  8. 【开源】简单4步搞定QQ登录,无需什么代码功底【无语言界限】

    说17号发超简单的教程就17号,qq核审通过后就封装了这个,现在放出来~~ 这个是我封装的一个开源项目:https://github.com/dunitian/LoTQQLogin ————————— ...

  9. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

随机推荐

  1. js面向对象(一)---基本的概念、属性、方法

    一.什么是面向对象编程 1.用对象的思想去写代码,就是面向对象编程 2.我们一直在使用对象,如数组Array    时间Date //我们把系统自带的对象,叫做系统对象 var arr = new A ...

  2. jsk

    题目描述 码队的女朋友非常喜欢玩某款手游,她想让码队带他上分.但是码队可能不会带青铜段位的女朋友上分,因为码队的段位太高(已经到达王者),恐怕不能和他的女朋友匹配游戏. 码队的女朋友有些失落,她希望能 ...

  3. 行动带来力量,周三(5月7日)晚IT讲座通知

    讲座简单介绍     ITAEM团队负责人骆宏等和大家周三晚8点(5月7日)相约钟海楼03035.和大家分享团队成员的"编程入门之路",在这里,同龄人(大三)以学生的角度.和大家分 ...

  4. 关于mysql的权限的问题

    昨天因为同学的mysql数据库不知道做了什么操作,从而导致root用户无法使用了 具体是使用root用户不需要密码 进去只能看 看到 infomation_schema 表 ,感觉root权限丢失了 ...

  5. Ubuntu16.04 使用PPA安装JDK8

    安装Java 8 ( 支持 Ubuntu 10.04 - Ubuntu 16.04 ) 1.如果你在 Ubuntu 软件中心安装过 OpenJDK,请先使用如下命令将其删除: sudo apt-get ...

  6. h5 app 设置全屏

    h5 app的全屏和沉浸式状态栏是不一样的 全屏模式 常见使用场景:如果页面是全屏游戏,一般会直接让状态栏消失,也就是页面全屏.webview高度全屏了,状态栏没有了.写法: 终端支持:没有终端类型限 ...

  7. __str__方法

    """str()就是可以自定义输出返回值,必须是str字符串""" class Dog: def __init__(self, name): ...

  8. delphi 获得系统目录

    利用Api函数,现在我介绍两个Api函数,利用他们就可以轻松简单的获取这些特殊系统目录. Function SHGetSpecialFolderLocation(hwndOwner: HWND; nF ...

  9. Java——子类对象实例化的全过程

    2.4子类对象实例化的全过程 public class TestDog { public static void main(String[] args) { Dog d = new Dog(); d. ...

  10. poj 3254 Corn Field

    Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; ...