题目:戳这里

题意:A和B博弈,三种操作分别是x:加a,y:减b,z:取相反数。当x或y或z为0,说明该操作不可取,数据保证至少有一个操作可取,给定一个区间(l,k)和原始数字m,如果A和B在n次操作以后使m小于等于l,则B赢,大于等于k则A赢。如果A或B实在赢不了,就会尽量让对方也没法赢。

解题思路:因为数据范围始终在[-100,100],我们就有了逆推的想法。思路是假如n=3且A必赢。因为我们假设的是A必赢,那么第三步之后的m一定在nu3:[k,100]之间,又因为第三步是A的操作,A肯定是哪步操作可以赢,就使用哪步操作,所以第三步以前的范围nu2是根据第三步以后的范围nu3:[k,100]对所有操作逆推出来的集合求并。据此从nu3逆推出nu2。

第三步之间就是第二步,第二步是B的操作,B如果有任何机会肯定是不会让A赢的,所以第二步之前的范围nu1是第二步以后nu2对所有操作逆推出来的集合求交。

nu1同nu3的推法。

第二种情况就是B必赢。也是和上面的思路一样推,如果A必赢和B必赢都无法满足,那一定是在(l,k)之间了。

看代码更好理解。

附ac代码:

  1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn = 1e3 + 10;
4 typedef long long ll;
5 int nu[maxn][11];
6 int ans[2][555];
7 int main()
8 {
9 int n, now ,l ,k;
10 scanf("%d %d %d %d", &n, &now, &k, &l);
11 for(int i = 1; i <= n; ++i)
12 {
13 scanf("%d %d %d", &nu[i][1], &nu[i][2], &nu[i][3]);
14 }
15 //B win
16 for(int j = -100; j <= 100; ++j)
17 {
18 if(j <= l)
19 ans[n & 1][j + 200] = 1;
20 else
21 ans[n & 1][j + 200] = 0;
22 }
23 for(int i = n; i >= 1; --i)
24 {
25 memset(ans[(i&1)^1], 0, sizeof(ans[(i&1)^1]));
26 for(int j = -100; j <= 100; ++j)
27 {
28 if(i&1)
29 {
30 int flag = 0;
31 if(nu[i][1])
32 {
33 int u = min(j + nu[i][1], 100);
34 if(!ans[i&1][u + 200]) flag++;
35 }
36 if(nu[i][2])
37 {
38 int u = max(j - nu[i][2], -100);
39 if(!ans[i&1][u + 200]) flag++;
40 }
41 if(nu[i][3])
42 {
43 int u = j * -1;
44 if(!ans[i&1][u + 200]) flag++;
45 }
46 // printf("%d %d %d %d\n", i, j, flag, ans[i&1][j + 200]);
47 if(!flag) ans[(i&1) ^ 1][j + 200] = 1;
48 }
49 else
50 {
51 int flag = 0, v = 0;
52 if(nu[i][1])
53 {
54 ++v;
55 int u = min(j + nu[i][1], 100);
56 if(!ans[i&1][u + 200]) flag++;
57 }
58 if(nu[i][2])
59 {
60 ++v;
61 int u = max(j - nu[i][2], -100);
62 if(!ans[i&1][u + 200]) flag++;
63 }
64 if(nu[i][3])
65 {
66 ++v;
67 int u = j * -1;
68 if(!ans[i&1][u + 200]) flag++;
69
70 }
71 // printf("%d %d %d u %d\n", i, j, flag == v, l);
72 if(flag != v) ans[(i&1) ^ 1][j + 200] = 1;
73
74 }
75 }
76 }
77 int bwin = 0;
78 for(int i = -100; i <= 100; ++i)
79 {
80 // printf("%d %d\n", i, ans[0][i + 200]);
81 if(ans[0][i + 200] && i == now)
82 {
83 ++bwin;
84 break;
85 }
86 }
87 for(int i = -100; i <= 100; ++i)
88 {
89 if(i >= k)
90 ans[n & 1][i + 200] = 1;
91 else
92 ans[n & 1][i + 200] = 0;
93 }
94
95 for(int i = n; i >= 1; --i)//a win
96 {
97 memset(ans[(i&1)^1], 0, sizeof(ans[(i&1)^1]));
98 for(int j = -100; j <= 100; ++j)
99 {
100 if(i & 1)
101 {
102 int flag = 0 ,v = 0;
103 if(nu[i][1])
104 {
105 ++v;
106 int u = min(j + nu[i][1], 100);
107 if(!ans[i&1][u + 200]) flag++;
108 }
109 if(nu[i][2])
110 {
111 ++v;
112 int u = max(j - nu[i][2], -100);
113 if(!ans[i&1][u + 200]) flag++;
114 }
115 if(nu[i][3])
116 {
117 ++v;
118 int u = j * -1;
119 if(!ans[i&1][u + 200]) flag++;
120 }
121 // printf("%d %d %d v %d\n", i, j, flag == v, ans[i&1][j + 200]);
122 if(flag != v) ans[(i&1) ^ 1][j + 200] = 1;
123 }
124 else
125 {
126 int flag = 0;
127 if(nu[i][1])
128 {
129 int u = min(j + nu[i][1], 100);
130 if(!ans[i&1][u + 200]) flag++;
131 }
132 if(nu[i][2])
133 {
134 int u = max(j - nu[i][2], -100);
135 if(!ans[i&1][u + 200]) flag++;
136 }
137 if(nu[i][3])
138 {
139 int u = j * -1;
140 if(!ans[i&1][u + 200]) flag++;
141 }
142 // printf("%d %d %d %d\n", i, j, flag, ans[i&1][j + 200]);
143 if(!flag) ans[(i&1) ^ 1][j + 200] = 1;
144 }
145 }
146 }
147 int awin = 0;
148 for(int i = -100; i <= 100; ++i)
149 {
150 if(ans[0][i + 200] && i == now)
151 {
152 ++awin;
153 break;
154 }
155 }
156 //printf("%d %d\n", awin, bwin);
157 if(!awin && !bwin) puts("Normal Ending");
158 if(awin) puts("Good Ending");
159 if(bwin) puts("Bad Ending");
160 return 0;
161 }

ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE 【模拟+博弈】的更多相关文章

  1. ACM-ICPC 2018 徐州赛区网络预赛 B. BE, GE or NE

    In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl named &qu ...

  2. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(记忆化搜索)

    https://nanti.jisuanke.com/t/31454 题意 两个人玩游戏,最初数字为m,有n轮,每轮三个操作给出a b c,a>0表示可以让当前数字加上a,b>0表示可以让 ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)

    链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...

  4. ACM-ICPC 2018 徐州赛区网络预赛 F Features Track(STL模拟)

    https://nanti.jisuanke.com/t/31458 题意 有N个帧,每帧有K个动作特征,每个特征用一个向量表示(x,y).两个特征相同当且仅当他们在不同的帧中出现且向量的两个分量分别 ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 I Characters with Hash(模拟)

    https://nanti.jisuanke.com/t/31461 题意 一个hash规则,每个字母映射成一个两位数,求给的字符串最后的编码位数,要求去除最终结果的前导零 分析 按题意模拟就是了 # ...

  6. ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心)

    ACM-ICPC 2018 徐州赛区网络预赛 G. Trace (思维,贪心) Trace 问答问题反馈 只看题面 35.78% 1000ms 262144K There's a beach in t ...

  7. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

  8. 计蒜客 1460.Ryuji doesn't want to study-树状数组 or 线段树 (ACM-ICPC 2018 徐州赛区网络预赛 H)

    H.Ryuji doesn't want to study 27.34% 1000ms 262144K   Ryuji is not a good student, and he doesn't wa ...

  9. ACM-ICPC 2018 徐州赛区网络预赛 B(dp || 博弈(未完成)

    传送门 题面: In a world where ordinary people cannot reach, a boy named "Koutarou" and a girl n ...

随机推荐

  1. 02--Docker配置阿里云镜像加速器

    1.登录阿里云控制台,在产品与服务中收索 "容器镜像服务" 2.点击镜像加速器,CentOS 3.在路径 /etc/docker/daemon.json 下配置加速器地址 4.重新 ...

  2. 一键测试VPS到国内速度脚本 SuperBench.sh,以及一键验收云主机脚本

    我们买国外VPS服务器测试网络通常会用到speedtest,speedtest默认是测试到最近的节点,那么到国内速度如何呢?虽然可以指定服务器编号,但是一个个测试还是比较麻烦的,这里推荐一个脚本整合了 ...

  3. 【转载】【GDB】GDB with Python

    作者:薛定谔的喵链接:https://zhuanlan.zhihu.com/p/152274203来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 你还在用GDB调试程序 ...

  4. TCP介绍

    TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. TC ...

  5. 某cms最新版前台RCE漏洞(无需任何权限)2020-03-15

    漏洞文件:application/common/controller/Base.php 中的 getAddonTemplate 方法: 错误的使用了public,导致我们可以直接外部访问. 然后使用了 ...

  6. 你可能不知道的 transition 技巧与细节

    CSS 中,transition 属性用于指定为一个或多个 CSS 属性添加过渡效果. 最为常见的用法,也就是给元素添加一个 transition,让其某个属性从状态 A 变化到状态 B 时,不再是非 ...

  7. linux:搭建java web环境

    介绍 运行java web的环境 搭建 准备 Linux:Linux 操作系统 Apache Tomcat:Web 应用服务器 JDK:Java 开发工具包 jdk的安装 1.下载 链接 2.上传服务 ...

  8. python3中zip对象的使用

    zip(*iterables) zip可以将多个可迭代对象组合成一个迭代器对象,通过迭代取值,可以得到n个长度为m的元组.其中n为长度最短可迭代对象的元素个数,m为可迭代对象的个数.并且每个元组的第i ...

  9. vue项目中如何引用tinymce

    最近公司在做一个CMS系统的项目,其中富文本编辑框用的很多,目前流行的也很多,包括wangEditor.TinyMCE.百度ueditor.kindeditor.CKEditor等.经过自己的一番翻箱 ...

  10. MVC与三层架构解析学习

    概要 MVC与三层架构不是简单的相等,二者之间存在一些区别. 今天,看到一位博主总结笔记,借鉴而来,以供以后学习. 将javaweb开发中的MVC(SSM框架)与三级架构比较,来解析二者之间的关系. ...