题目:A Shooting Game

题目大意:题目好长>_<。大致是说有一个游戏,有n列,每列最多6个方块,这些方块是垂直放的如果下面没有东西了就会垂 直掉下来(初始方块的状态有限制条件不过这题没用)。现在有两个人玩游戏,他们各有一支枪,每发子弹的攻击力为1、2或3,概率均为1/3。可以选择从左 攻击或从右攻击,可以自己选择一行,发射子弹之后最多打掉子弹攻击力个方块(如果子弹攻击力比方块多,那么就只有浪费掉了),然后悬浮的方块会往下掉。现 在这两个人都足够聪明,每次都会选择胜率最高的来开枪,问先手的胜率。

思路:容易看出状态数最多有7^6=117649种,记忆化搜索可以解决(我总觉得这是暴力求破)。分别计算从左边六行发射子弹的胜 率,再计算右边六行发射子弹的胜率,取最大的一个(这玩游戏的人真是神智商,你以为个个都是冯洛伊曼吗……)。用dp[x1][x2][x3][x4] [x5][x6]来记录一个人面临第一列x1个,第二列x2个……的状态的胜率即可。注意处理细节还是比较容易AC的。

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cmath>
 6 using namespace std;
 7 typedef long long LL;
 8 #define FOR(i, s, t) for(int i = s; i <= t; ++i)
 9
10 const int MAXS = 50010;
11 const int MAXN = 8;
12 const double EPS = 1e-8;
13
14 double a[7][7][7][7][7][7];
15
16 double solve(int p1, int p2, int p3, int p4, int p5, int p6) {
17     if(a[p1][p2][p3][p4][p5][p6] > EPS) return a[p1][p2][p3][p4][p5][p6];
18     if(p1 + p2 + p3 + p4 + p5 + p6 == 0) return 0;
19     int v1, v2, v3, v4, v5, v6;
20     double ret = 0;
21     for(int i = 1; i <= 6; ++i) {
22         double tmp = 0;
23         for(int j = 1; j <= 3; ++j) {
24             v1 = p1, v2 = p2, v3 = p3, v4 = p4, v5 = p5, v6 = p6;
25             int k = j;
26             if(v1 >= i && k) --v1, --k;
27             if(v2 >= i && k) --v2, --k;
28             if(v3 >= i && k) --v3, --k;
29             if(v4 >= i && k) --v4, --k;
30             if(v5 >= i && k) --v5, --k;
31             if(v6 >= i && k) --v6, --k;
32             if(k == j) continue;
33             tmp += 1./3 * (1 - solve(v1, v2, v3, v4, v5, v6));
34         }
35         if(tmp > ret) ret = tmp;
36         tmp = 0;
37         for(int j = 1; j <= 3; ++j) {
38             v1 = p1, v2 = p2, v3 = p3, v4 = p4, v5 = p5, v6 = p6;
39             int k = j;
40             if(v6 >= i && k) --v6, --k;
41             if(v5 >= i && k) --v5, --k;
42             if(v4 >= i && k) --v4, --k;
43             if(v3 >= i && k) --v3, --k;
44             if(v2 >= i && k) --v2, --k;
45             if(v1 >= i && k) --v1, --k;
46             if(k == j) continue;
47             tmp += 1./3 * (1 - solve(v1, v2, v3, v4, v5, v6));
48         }
49         if(tmp > ret) ret = tmp;
50     }
51     return a[p1][p2][p3][p4][p5][p6] = ret;
52 }
53
54 int x[7], n;
55
56 int main() {
57     //FOR(i1, 0, 6) FOR(i2, 0, 6) FOR(i3, 0, 6) FOR(i4, 0, 6) FOR(i5, 0, 6) FOR(i6, 0, 6)
58         //if(a[i1][i2][i3][i4][i5][i6] < EPS) solve(i1, i2, i3, i4, i5, i6);
59     while(scanf("%d", &n) != EOF && n) {
60         memset(x, 0, sizeof(x));
61         for(int i = 1; i <= n; ++i) scanf("%d", &x[i]);
62         printf("%.6f\n", solve(x[1], x[2], x[3], x[4], x[5], x[6]));
63     }
64 }

转载于:https://www.cnblogs.com/scnuacm/p/3280332.html

H - A Shooting Game相关推荐

  1. 河南省第十届大学生程序设计竞赛 A,B,C,D,F,G,H 题解

    H: Intelligent Parking Building 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 20 [提交][状态][讨论版] 题目描述 There is ...

  2. Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题,在 TX2 系统上,告警提示磁盘空间不够,如图所示 wohu@wohu:/$ df -h Filesystem Size Used Avail Use% Mounted ...

  3. Linux实现ffmpeg H.265视频编码

    Linux实现ffmpeg H.265视频编码 几乎所有观看的视频,数字地面电视,电缆,卫星或互联网上的压缩.原始的,未压缩的视频太大,会浪费太多的带宽.在DVD和Blu-ray之前,有视频CD(VC ...

  4. H.264 Video Codec速度和质量

    H.264 Video Codec速度和质量 从Kepler开始的所有 NVIDIA GPUs 都支持完全加速的硬件视频编码: GPUs 从费米开始支持完全加速的硬件视频解码.最近发布的图灵硬件提供了 ...

  5. H.265 HD 和H.265 4K Video Encoder IP Core

    H.265 HD 和H.265 4K Video Encoder IP Core H.265 HD Video Encoder IP Core(H.265 HD Video/Audio Encoder ...

  6. H.265视频编码与技术全析(下)

    H.265视频编码与技术全析(下) 四.帧内预测模式 共35个(h264有9个),包括Planar,DC,33个方向模式: 除了Intra_Angular预测外,HEVC还和H.264/MPEG-4 ...

  7. H.265视频编码与技术全析(上)

    H.265视频编码与技术全析(上) 一. 概述 作为新一代视频编解码格式,H.265得到越来越广泛的应用.不久之前,苹果公司在翘首期盼中发布了iPhone6,该款手机较之以往的iPhone,不仅仅只是 ...

  8. H.264/H265码流解析

    H.264/H265码流解析 一.H.264码流解析 一个原始的H.264 NALU 单元常由 [StartCode] [NALU Header] [NALU Payload] 三部分组成 一个原始的 ...

  9. C++ .h(头文件) 与 .cpp(源文件) 的使用

    .h 文件: .h是头文件 ,里面主要是写类的声明(包括类里面的成员和方法的声明).函数原型.#define常数等, 注意.h文件写的时候有特定的格式就是开头和结尾 #ifndef TEST_HEAD ...

最新文章

  1. postfix邮件服务器搭建
  2. java 成员变量 成员方法_《Java基础知识》Java成员变量,成员方法,构造方法和析构方法...
  3. pandas.DataFrame删除/选取含有特定数值的行或列实例
  4. Caffe代码导读(2):LMDB简介
  5. Controller的传参问题
  6. 共模电压和差模电压-(定义及测量)
  7. centos上那装qq2012
  8. Google Android 平台正式开源
  9. php数组转ini文件,php – 将数组转换为.ini文件
  10. 如何将c语言程序封装供python调用_C++调用python
  11. 微软版UnityVs横空出世,究竟是谁成就了谁?
  12. X 分钟速成 Python
  13. list,set,map,数组之间的相互转换详细解析
  14. ARP欺骗***技术及防护
  15. Android透明状态栏或者渐变色状态栏
  16. 一道九宫格算法面试题
  17. matlab 求公切线方程,【原创】绘制两圆公切线MATLAB代码
  18. sqlserver把某个字段多行逗号隔开
  19. 云计算机可以玩游戏吗,免费云桌面系统能跟云电脑一样玩游戏吗?
  20. 【mysql数据库】通过python 3.7 爬虫获取企查查公开的企业信息,并记录到数据库

热门文章

  1. 光通量发光强度照度亮度关系_照度、强光、光通量之间是什么关系
  2. linux下各种文件设备,各硬件设备在Linux中的文件名
  3. google地球无法连接_WiFi无法连接?解决macOS Big Sur/Mojave/ Catalina上的Wi-Fi问题
  4. 使用Keras打造一个实时可用交通标志识别App
  5. 从RCNN到SSD,深度学习目标检测算法盘点
  6. 动态生成java类_Java 运行时动态生成class
  7. asp.net gridview 模板列 弹出窗口编辑_Mac桌面多窗口整理工具Moom,使用教程
  8. Java的scjp,Java(一些基础) for SCJP
  9. 案例:需求问题的解决方案
  10. PROJ.4学习——地图投影