题目:戳这里

题意: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. Podinfo,迷你的 Go 微服务模板

    ​项目介绍 Podinfo 是一个用 Go 制作的小型 web 应用程序,它展示了在 Kubernetes 中运行微服务的最佳实践. 它已实现的技术指标(截选自官方 README.md ): 里面每一 ...

  2. 【MYSQL】DDL语句

    介绍:DDL语句,即数据定义语句,定义了不同的数据段,数据库表.表.列.索引等数据库对象:例如,create.drop.alter 适用对象:一般是由数据库管理员DBA使用 1.连接数据库 mysql ...

  3. MYSQL基础知识的复习2

    1.修改表中的数据 update 表名 set 要修改的字段 where 条件;-- 如果修改多个字段那么字段和字段之间用逗号隔开 2.查询(很重要) 1.查询表中部分字段: select 字段名,字 ...

  4. Python爬虫要学什么?写给小白的Python爬虫必备技能

    Python在爬虫方面用得比较多,所以你如果能掌握以下内容,找工作的时候就会顺利很多: 1.爬虫,不是抓取到数据就完事了,如果有数据抽取.清洗.消重等方面经验,也是加分项; 2.大部分的公司都要求爬虫 ...

  5. 路由协议-RIP协议

    一.路由协议的发展历程和分类 距离矢量路由协议--听信"谣言",使用跳数作为度量值,最大16(0-15)跳:RIP 链路状态路由协议--"地图"路由协议:OSP ...

  6. Windows Server 2008 R2系统安装

    把系统U盘插到服务器上,然后启动服务器进入BIOS界面选择U盘启动. 根据服务器的不同,进入BIOS界面的按钮也不一样,主流的有F10.F11.F12.F2.ESC.delete等. 在从BIOS启动 ...

  7. 手写Netty之多路复用Select小案例

    注意:本文只是将上文多路复用器Select.Poll.Epoll区别梳理中提出的概念与Netty中的步骤联系起来,方便后面回顾,代码中注释很多,对于大家来说如果不是怀有同样的目的,不一定有用. 单线程 ...

  8. day03 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数

    本节内容 1. 函数基本语法及特性 2. 参数与局部变量 3. 返回值 嵌套函数 4.递归 5.匿名函数 6.函数式编程介绍 7.高阶函数 8.内置函数 温故知新 1. 集合 主要作用: 去重 关系测 ...

  9. 实用 nginx.conf 用法大全

    服务器拒绝非GET方式请求保障安全性,因为 DELETE.POST.PUT 是可以修改数据的. Nginx 解决方案 在 nginx.conf 配置文件的网站配置区域中添加如下代码片段: 非 GET ...

  10. 一个关于ExecutorService shutdownNow时很奇怪的现象

    我们知道很多类库中的阻塞方法在抛出InterruptedException后会清除线程的中断状态(例如 sleep. 阻塞队列的take),但是今天却发现了一个特别奇怪的现象,先给出代码: publi ...