题目跳转

思路:这道题可能跟博弈论有一点关系,没有学习过博弈论做起来应该问题也不大。思考一个问题,先手必胜的前提是什么?

有关更多的内容可以前往:浅谈有向无环图

  • 先手必胜的前提是,在任何一种局面下,先手都有至少一种操作可以使后手处于必败的局面。
  • 若先手进行任何操作后,后手都可以选择必胜的操作,则先手无法必胜。
  • 如果当前玩家无法进行任何操作,那么对手获胜。

整体的思路就是通过递归不断搜索每一种决策情况,判断是否存在必胜的策略。

具体的实现方法:

创建两个函数,名为firstsecond

  1. first(x, y)函数返回当两位玩家分别选择数字xy时,先手是否必胜。
  2. second(x, y)函数返回当两位玩家分别选择数字xy时,后手是否必胜。

两个函数来回交替调用对方,即在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;
}

参考代码二:

  1. 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.星光交错的律动的更多相关文章

  1. Codeforces Round #102 (Div. 2) 题解

    A. 解一个方程. 还是厚颜无耻地暴力吧~ #include <iostream> using namespace std; int r1, r2, c1, c2, d1, d2; boo ...

  2. 【cogs 597】【dp】交错匹配

    597. 交错匹配 ★☆ 输入文件:crossa.in 输出文件:crossa.out 简单对照 时间限制:1 s 内存限制:128 MB [问题描写叙述] 有两行自然数. UP[1..N] . DO ...

  3. 题解 P4093 【[HEOI2016/TJOI2016]序列】

    这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...

  4. JLOI2015 DAY2 简要题解

    「JLOI2015」骗我呢 题意 问有多少个 \(n \times m\) 的矩阵 \(\{x_{i, j}\}\) 满足 对于 \(\forall i \in [1, n], j \in [1, m ...

  5. 算法(第四版)C# 习题题解——1.1

    写在前面 整个项目都托管在了 Github 上:https://github.com/ikesnowy/Algorithms-4th-Edition-in-Csharp 善用 Ctrl + F 查找题 ...

  6. CQOI2018简要题解

    CQOI2018简要题解 D1T1 破解 D-H 协议 题意 Diffie-Hellman 密钥交换协议是一种简单有效的密钥交换方法.它可以让通讯双方在没有事先约定密钥(密码)的情况下,通过不安全的信 ...

  7. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...

  8. 【jsoi】第一季 [略]精简题解

    UPD:好像有两道题的代码逃跑了?= =就先不找了,反正都是水题. 精简题解系列第四弹.(其实也不是那么精简啊= =) [JSOI2008]最大数maxnumber 单点修改,区间最大值查询,裸线段树 ...

  9. Noip2016题解&总结

    原文放在我的uoj博客上,既然新开了blog,那就移过来了 玩具谜题(toy) 送分题.没有什么好说的. 直接按照题目的要求模拟即可. 标准的noip式day1T1. #include<cstd ...

  10. Bzoj 1997 [Hnoi2010]Planar题解

    1997: [Hnoi2010]Planar Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2224  Solved: 824[Submit][Stat ...

随机推荐

  1. Java 内存分析(程序实例),学会分析内存,走遍天下都不怕!!!

    相信大多数的java初学者都会有这种经历:碰到一段代码的时候,不知该从何下手分析,不知道这段代码到底是怎么运行最后得到结果的..... 等等吧,很多让人头疼的问题,作为一名合格的程序员呢,遇到问题一定 ...

  2. CentOS升级内核-- CentOS9 Stream/CentOS8 Stream/CentOS7

    官方文档在此 升级原因 当我们安装一些软件(对,我说的就是Kubernetes),可能需要新内核的支持,而CentOS又比较保守,不太升级,所以需要我们手工升级. # 看下目前是什么版本内核 unam ...

  3. k8s 深入篇———— 一些容器操作的原理[三]

    前言 简单介绍一下一些容器的操作原理. 正文 docker exec 是怎么做到进入容器里的呢. 比如说: 这里有一个容器,我们可以exec 进去: docker exec -it b265 /bin ...

  4. Vue购物车展示功能

    1.基本购物车 <body> <div id="app"> <div class="container-fluid"> &l ...

  5. 第六課-Channel Study For TCP Listener & HTTP Listener & Web Service Listener About Response Handler

    经过前面章节的课程,对Mirth Connect在系统集成与数据交互中的使用有了一个大概的了解:大家一定有个疑惑,Mirth Connect如何组织响应消息并返回给调用者?今天我们就来继续深入讲解Re ...

  6. 力扣459(java)-重复的子字符串(简单)

    题目: 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成. 示例 1: 输入: s = "abab"输出: true解释: 可由子串 "ab&quo ...

  7. 力扣68(java)-文本左右对齐(困难)

    题目: 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本. 你应该使用 "贪心算法" ...

  8. HarmonyOS NEXT应用开发之深色模式适配

    介绍 本示例介绍在开发应用以适应深色模式时,对于深色和浅色模式的适配方案,采取了多种策略如下: 固定属性适配:对于部分组件的颜色属性,如背景色或字体颜色,若保持不变,可直接设定固定色值或引用固定的资源 ...

  9. Databricks 企业版 Spark&Delta Lake 引擎助力 Lakehouse 高效访问

    ​简介:本文介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度. 作者: 李锦桂(锦犀) 阿里云开源大数据 ...

  10. 阿里云田涛涛:高效智能的云,CloudOps让运维更简单

    ​简介:CloudOps:以应用为中心的自动化运维新趋势 12月21日,在阿里云弹性计算年度峰会上,阿里云弹性计算体验与控制系统负责人田涛涛发表了主题为<高效智能的云,CloudOps让运维更简 ...