题目:戳这里

题意: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. 使用ogg实现oracle到postgresql表的实时同步

    参考:https://docs.oracle.com/goldengate/c1221/gg-winux/index.html https://blog.51cto.com/hbxztc/188071 ...

  2. html简单基础

    标签语法 标签的语法: <标签名 属性1="属性值1" 属性2="属性值2"-->内容部分</标签名> <标签名 属性1=&quo ...

  3. the minimum number of bits required to represent x 最小位数

    src/math/bits/bits.go:296 // --- Len ---// Len returns the minimum number of bits required to repres ...

  4. Axure RP 9版本最新版授权码和密钥 亲测可用

    分享Axure RP 9版本最新版授权码和密钥 亲测可用 声明:以下资源的获取来源为网络收集,仅供学习参考,不作商业用途,如有侵权请联系博主删除,谢谢! 自新的Axure RP 9.0 Beta版发布 ...

  5. P1663 山

    写在前面 简单的二分答案,稍微加点数学计算,很有意思. 算法思路 二分答案可行的原因:答案具有单调性. 这道题目中证明一下:首先无限高显然是能看到任何一个点的,且山的每一条边都是对答案的一个限制,因此 ...

  6. EasyConnect连接成功后,虚拟ip地位未分配

    文章目录 #问题描述: 今天公司做项目,连接上EasyConnect以后,显示连接成功,但是虚拟ip地址未分配,导致无法远程连接数据库,以及svn无法更新项目. #解决办法: 百度网上各种解决办法,没 ...

  7. 码一次前后台post请求交互,以及接口的使用,json数据格式的传递

    近几天,公司疯狂加班,然后补做了很多功能,很多东西虽然是自己熟悉的,但是却不会上手,动手实践能力仍需加强,对此对一些代码记录,留待学习和总结. 简单描述功能 具体实现 前台JSP.JS.后台actio ...

  8. (28)Vim 4

    1.Vim多窗口编辑 在编辑文件时,有时需要参考另一个文件,如果在两个文件之间进行切换则比较麻烦.可以使用 Vim 同时打开两个文件,每个文件分别占用一个窗口. 例如,在査看 /etc/passwd ...

  9. 学生信息管理系统总结——student数据库中表关系分析

    说到关系,那就不得不提两个东西: 1.E-R图,也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型 2.关系模 ...

  10. php小项目-web在线文件管理器

    php小项目-web在线文件管理器 一 项目结果相关视图 二 项目经验 通过简单的实现小项目,对php的文件相关操作更加熟悉,主要用于熟悉文件的相关操作 三 源代码下载地址 http://files. ...