http://codeforces.com/problemset/problem/175/D (题目链接)

题意

  A,B两人玩坦克大战,坦克有生命值,射击间隔,伤害范围,未命中的概率。问A赢的概率是多少。

Solution

  直接做并不好做,注意到精度要求只有$10^{-4}$,也就是说当射击次数达到一定上限之后,满足了精度要求我们就可以不做了。我们考虑按照时间dp。怎么设计状态呢,如果$f[i][j]$表示A还剩$i$点生命值,B还剩$j$点生命值,这样复杂度太高了,我们考虑将A和B剩余生命分开dp。

  $f[i][j]$表示A被射击$i$次后,还剩下$j$点生命值的概率,特殊的,$f[i][0]$表示在射击次数$<=i$时A死亡的概率。B的同理。转移很显然:$$f[i][max(0,j-x)]=f[i-1][j]*(1-p)/(r-l+1)+f[i-1][j]*p$$

  我们预处理出$D$次射击后A,B的dp数组。考虑怎么计算答案。如果B在第$K$轮挂掉了,那么要求A在第$K$轮射击之前没有死,那么这个时候A被射击了多少次呢,我们可以算出来:$$T=((K-1)*dt_A+dt_B-1)/dt_B$$

  那么A在第$K$轮胜出的概率为:$$ans_K=(1-f_A[T][0])*f_B[K][0]$$

  最后把所有的$ans$累加起来就可以了。

细节

  mdzz写了半天,各种坑点,本机1s多CF上居然TLE了是什么鬼嘛,智力-2。

  时间设到4000差不多够了。

  当$f[i][j]==0$的时候不dp,但是!但是!!要这样写:$f[i][j]<=eps$。。一把辛酸泪啊T_T

  要特判$p_A=100$和$p_B=100$的情况,而且前者一定要写在后者之前T_T。

代码

// codeforces175D
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<ctime>
#define LL long long
#define eps 1e-8
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; double f[2][4010][210],p[2],ans;
int hp[2],dt[2],L[2],R[2],P[2],n,x; int main() {
for (int i=0;i<2;i++) scanf("%d%d%d%d%d",&hp[i],&dt[i],&L[i],&R[i],&P[i]);
if (P[0]==100) {puts("0");return 0;} //must first
if (P[1]==100) {puts("1");return 0;}
f[0][0][hp[0]]=f[1][0][hp[1]]=1;p[0]=P[0]/100.0;p[1]=P[1]/100.0;
for (x=1;x<=4000;x++) {
for (int i=0;i<2;i++)
for (int l=i^1,j=1;j<=hp[i];j++) {
if (f[i][x-1][j]<=eps) continue;
for (int k=L[l];k<=R[l];k++)
f[i][x][max(0,j-k)]+=f[i][x-1][j]*(1-p[l])/(R[l]-L[l]+1);
f[i][x][j]+=f[i][x-1][j]*p[l];
}
f[0][x][0]+=f[0][x-1][0];
}
for (int i=1;i<=x;i++) {
int T=((i-1)*dt[0]+dt[1]-1)/dt[1];
if (T>x) break;
ans+=(1-f[0][T][0])*f[1][i][0];
}
printf("%.6lf\n",ans);
return 0;
}

【codeforces 175D】 Plane of Tanks: Duel的更多相关文章

  1. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  2. 【25.33%】【codeforces 552D】Vanya and Triangles

    time limit per test4 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  3. 【26.67%】【codeforces 596C】Wilbur and Points

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  4. 【codeforces 749B】Parallelogram is Back

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  5. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  6. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  7. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  8. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  9. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

随机推荐

  1. 线上分享-- 基于DDD的.NET开发框架-ABP介绍

    前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...

  2. 虚拟机console基础环境配置——系统镜像站点配置

    1. 概述2. 部署HTTP服务器2.1 YUM安装httpd2.2 配置httpd2.3 启动httpdf2.4 测试httpd3. 部署FTP服务器3.1 YUM安装vsftpd3.2 配置vsf ...

  3. Git的学习与使用

    Git使用教程 一:Git是什么? Git是目前世界上最先进的分布式版本控制系统. 二:SVN和Git最主要的区别? SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自 ...

  4. 转:SpringMVC之类型转换Converter(GenericConverter)

    转: http://blog.csdn.net/fsp88927/article/details/37692215 SpringMVC 之类型转换 Converter 1.1 目录 1.1 目录 1. ...

  5. 6大爱上react 的理由

    本文翻译自:https://blog.syncano.io/reactjs-reasons-why-part-1/ 书写javascript 更加简单 (⚠️js 中混用html 也一直是外界所诟病的 ...

  6. oracle数据恢复方法

    https://www.cnblogs.com/hqbhonker/p/3977200.html

  7. 《linux内核设计与实现》读书笔记——第三章

  8. 软件项目第一次sprint评论

    软件项目第一次sprint评论 组名:天线宝宝四人组                                   姓名:高长志 1. 组名:9-652组 项目:炸弹人游戏 对于炸弹人游戏,首先 ...

  9. “数学口袋精灵”App的第三个Sprint计划----开发日记(第一天12.7~第十天12.16)

    “数学口袋精灵”第三个Sprint计划----第一天 项目进度: 基本完成一个小游戏,游戏具有:随机产生算式,判断对错功能.通过轻快的背景音乐,音效,给玩家提供一个良好的氛围.  任务分配: 冯美欣: ...

  10. 第八章Jdk代理 cglib代理

    什么是代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 这 ...