【题解】A18536.星光交错的律动
思路:这道题可能跟博弈论有一点关系,没有学习过博弈论做起来应该问题也不大。思考一个问题,先手必胜的前提是什么?
有关更多的内容可以前往:浅谈有向无环图
- 先手必胜的前提是,在任何一种局面下,先手都有至少一种操作可以使后手处于必败的局面。
- 若先手进行任何操作后,后手都可以选择必胜的操作,则先手无法必胜。
- 如果当前玩家无法进行任何操作,那么对手获胜。
整体的思路就是通过递归不断搜索每一种决策情况,判断是否存在必胜的策略。
具体的实现方法:
创建两个函数,名为first
和second
。
first(x, y)
函数返回当两位玩家分别选择数字x
和y
时,先手是否必胜。second(x, y)
函数返回当两位玩家分别选择数字x
和y
时,后手是否必胜。
两个函数来回交替调用对方,即在first(x, y)
函数中调用second(x, y)
函数,在second(x, y)
中调用first(x, y)
。如果存在必胜的策略,返回true
,否则返回false
。若先手玩家无法再进行操作时,也返回false。
时间复杂度分析:本道题目将通过深度优先搜索DFS的方式来实现,每一层递归模拟某一位玩家的两个决策(将数字乘二或将数字除以三)。因此本道题目的时间复杂度大致为\(O(2^d)\),其中\(d\)表示递归的深度。考虑题目数据范围\(1 <= x, y <= 1000\),递归深度约为\(\log2(\frac{x+y}{2})\),完全可以在限定时间内通过所有的测试点。
参考代码一:
#include <iostream>
#include <cstring>
using namespace std;
int vis[1005];
bool last(int x, int y);
bool first(int x, int y){
bool isEnd, p1, p2;
isEnd = p1 = p2 = true;
if (x * 2 <= 1000 && !vis[x * 2]){
isEnd = false;
vis[x * 2] = 1;
p1 = last(x*2, y);
vis[x * 2] = 0;
}
if (x % 3 == 0 && !vis[x / 3]){
isEnd = false;
vis[x / 3] = 1;
p2 = last(x / 3, y);
vis[x / 3] = 0;
}
if (isEnd) return false;
// 如果后手有一条方案会必死,那么先手就一定赢。
return !(p1 && p2);
}
bool last(int x, int y){
bool isEnd, p1, p2;
isEnd = p1 = p2 = true;
if (y * 2 <= 1000 && !vis[y * 2]){
isEnd = false;
vis[y * 2] = 1;
p1 = first(x, y * 2);
vis[y * 2] = 0;
}
if (y % 3 == 0 && !vis[y / 3]){
isEnd = false;
vis[y / 3] = 1;
p2 = first(x, y / 3);
vis[y / 3] = 0;
}
if (isEnd) return false;
return !(p1 && p2);
}
int main(){
int t, x, y;
cin >> t;
while(t--){
memset(vis, 0, sizeof vis);
cin >> x >> y;
if (first(x, y)) cout << "Macw07" << endl;
else cout << "Penelope_77" << endl;
}
return 0;
}
参考代码二:
decision(r)
函数返回当两位玩家分别选择数字val[0]
和val[1]
时,r
选手(先手为0,后手为1)是否必胜。
#include <iostream>
#include <cstring>
using namespace std;
int vis[1005];
int val[5];
bool decision(int r){
bool isEnd, p1, p2;
isEnd = p1 = p2 = true;
if (val[r] * 2 <= 1000 && !vis[val[r] * 2]){
isEnd = false;
val[r] *= 2;
vis[val[r]] = 1;
p1 = decision(!r);
vis[val[r]] = 0;
val[r] /= 2;
}
if (val[r] % 3 == 0 && !vis[val[r] / 3]){
isEnd = false;
val[r] /= 3;
vis[val[r]] = 1;
p2 = decision(!r);
vis[val[r]] = 0;
val[r] *= 3;
}
if (isEnd) return false;
return !(p1 && p2);
}
int main(){
int t, x, y;
cin >> t;
while(t--){
memset(vis, 0, sizeof vis);
cin >> x >> y;
val[0] = x;
val[1] = y;
if (decision(0)) cout << "Macw07" << endl;
else cout << "Penelope_77" << endl;
}
return 0;
}
【题解】A18536.星光交错的律动的更多相关文章
- Codeforces Round #102 (Div. 2) 题解
A. 解一个方程. 还是厚颜无耻地暴力吧~ #include <iostream> using namespace std; int r1, r2, c1, c2, d1, d2; boo ...
- 【cogs 597】【dp】交错匹配
597. 交错匹配 ★☆ 输入文件:crossa.in 输出文件:crossa.out 简单对照 时间限制:1 s 内存限制:128 MB [问题描写叙述] 有两行自然数. UP[1..N] . DO ...
- 题解 P4093 【[HEOI2016/TJOI2016]序列】
这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...
- JLOI2015 DAY2 简要题解
「JLOI2015」骗我呢 题意 问有多少个 \(n \times m\) 的矩阵 \(\{x_{i, j}\}\) 满足 对于 \(\forall i \in [1, n], j \in [1, m ...
- 算法(第四版)C# 习题题解——1.1
写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 善用 Ctrl + F 查找题 ...
- CQOI2018简要题解
CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...
- 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)
这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...
- 【jsoi】第一季 [略]精简题解
UPD:好像有两道题的代码逃跑了?= =就先不找了,反正都是水题. 精简题解系列第四弹.(其实也不是那么精简啊= =) [JSOI2008]最大数maxnumber 单点修改,区间最大值查询,裸线段树 ...
- Noip2016题解&总结
原文放在我的uoj博客上,既然新开了blog,那就移过来了 玩具谜题(toy) 送分题.没有什么好说的. 直接按照题目的要求模拟即可. 标准的noip式day1T1. #include<cstd ...
- Bzoj 1997 [Hnoi2010]Planar题解
1997: [Hnoi2010]Planar Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2224 Solved: 824[Submit][Stat ...
随机推荐
- HUAWEI DevEco Studio 3.1版本发布,配套ArkTS声明式开发全面升级
原文:https://mp.weixin.qq.com/s/ap5gH7vm3BUm0nU2WOzAzw,点击链接查看更多技术内容. 今年开发者大会发布了HarmonyOS应用开发套件Dev ...
- GAN的一些问题
GAN为什么难以训练? 大多深度模型的训练都使用优化算法寻找损失函数比较低的值.优化算法通常是个可靠的"下山"过程.生成对抗神经网络要求双方在博弈的过程中达到势均力敌(均衡).每个 ...
- mysql 简单进阶 ———— 多列索引[一]
前文 整理一下mysql 的一些简单进阶技巧,来源于高性能mysql,但不是根据书的序列来的. 正文 库地址: https://dev.mysql.com/doc/index-other.html 有 ...
- 重学c#系列——索引器(十)
前言 对于索引器,我们肯定不会陌生.为什么会有索引器这个东西呢?我们发现这东西很像是属性,只是通过索引方式去调用,那就慢慢揭开他的面纱吧. 正文 假设我们要对外暴露一个数组,为了体现其封装性,我们使用 ...
- 重新整理数据结构与算法(c#)—— 二叉树排序树[二十二]
前言 什么是二叉堆排序呢? 就是上面这种,一个节点大于左节点,但是小于右节点,再我写的例子中会写出大于等于右节点. 那么如何让一个数组进行变成这种二叉树呢? 其实只要有规律就很简单. 第一个元素(0) ...
- swing 聊天窗体,支持图文模式
package com.*.test; import java.awt.EventQueue; import java.awt.HeadlessException; import java.awt.T ...
- 介绍一个气缸控制的FB程序块
关键词: 气缸,双控.单控.电磁阀.感应器.初始位置(简称"始位").末端位置(简称"端位").屏蔽功能.延时功能.报警功能 正文: 1.为什么要做气缸FB功能 ...
- 学Windows批处理第一天:使用批处理命令生成一个文件并写入内容
脚本功能:1.生成一个文件,文件名格式为:yyyymmddhhmmss 2.文件中写入一段文本 操作步骤:1.新建一个文本文档(txt格式) 2.修改文件名为任意名称(我的叫create_file), ...
- 如何解决打不开Microsoft Store的痛处?
换了机房后,我最喜欢的计算器和画图3d没有了,网上的方法都行不通,怎么办? 第一步,在百度上搜索你想安装的东西,例如我搜索的画图3d,就会有这个链接. 然后,把这个链接复制到这个网站的搜索框中,就会有 ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-38-如何截图-下篇
1.简介 这个系列的文章也讲解和分享了差不多三分之一吧,突然有小伙伴或者童鞋们问道playwright有没有截图的方法.答案当然是:肯定有的.宏哥回过头来看看确实这个非常基础的知识点还没有讲解和分享. ...