题意

从前有两个人,一个叫Utkarsh,另外一个叫Ashish。
这两个人在一个2D的棋盘上玩移动棋子的游戏,一开始从原点出发,Ashish先手。每次可以把棋子向上或者是向右移动k个单位的距离。两人交替移动,游戏规定棋子距离原点的距离必须要小于d。当有人移动不了棋子的时候落败。

现在给出d和k,要求在两人都智商爆表的情况下,谁会获胜。

样例

首先输入一个整数t,表示测试数据的组数。接着输入t行,每行代表一个样例。每一行输入两个整数,

要求输出胜者的名字。

关于第一个样例的解释:

我们可以发现当两人轮流执行一个回合之后,Ashish一定无路可去,所以胜者是Utkarsh。

题解

一拿到手,我们会很自然地觉得这是一道博弈论的问题。

实际上看起来也非常像,两个人轮流游戏,包括游戏的一些细节,轮流移动,不能移动者落败,都很符合博弈论问题的特征。从博弈论入手的话,我们会想到必败态和必胜态之间的转化。

我们进一步分析的话,也不难想到思路。我们把这个平面想象成一个用一个扇形笼罩的区域,对于靠近扇形边境上的点,只有我们知道了坐标,就可以计算出来从原点出发到达这里需要的步数,步数知道了自然也就知道了最终是哪一个人落在了这个点。

这样我们首先确定下来边境的胜负状况之后,我们就可以逐渐往内层倒推,最终求解出原点的状态。这个推导的转移非常容易想明白,对于每个点来说它最多只有向右和向上两条路,对于该点做决策的人来说,只要这两个决策当中有一个能够到达自己的必胜态,那么该点自然也是必胜态。这其实有点动态规划的思想了,通过这种方法,我们可以求解出平面上每一个能够达到的点的状态。

看似这个问题就已经做完了,非常简单,但是我们稍微分析一下就会发现这样是不行的。道理也很简单,因为复杂度太大,会超时。

极端情况下当d的量级是1e5,并且k=1的时候,我们需要考虑的点的数量应该在1e10这个量级,这显然是不能接受的。那除了这个办法之外还有其他方法可行吗?

很多时候看似问题很难解决,往往是我们走错了路。我们一直想着怎么递推,怎么获取每个点的状态,其实一开始这个思路就错了。这个时候需要我们把这些念头放一放,回归到问题本身。

我们把自己代入先手的玩家,我们会想出什么策略?你会发现好像一时半会也没什么特别好的策略?但如果我们是后手玩家呢?你会发现好的策略可能没有,但是赖皮的套路却是存在的。因为这个扇形是一个四分之一圆,它是对称的。所以我们可以利用后发的优势镜像先手的行动,先手往上我们往右,先手往右我们往上,这样我们可以保证我们的点始终落在斜对角线。这样只要先手可以前进,那么后手就一定可以移动。也就是顺着下图的路线移动。

那这样岂不是先手必输吗?其实也不是的,也有例外。就是当后手无法回到斜线的时候,也就是说((x+1)k, xk)距离原点小于d,而((x+1)k, (x+1)k)大于d的时候。

这样我们就可以很方便写出代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <string>
#include <map>
#include <set>
#include <algorithm>
#include "time.h"
#include <functional>
#define rep(i,a,b) for (int i=a;i<b;i++)
#define Rep(i,a,b) for (int i=a;i>b;i--)
#define foreach(e,x) for (__typeof(x.begin()) e=x.begin();e!=x.end();e++)
#define mid ((l+r)>>1)
#define lson (k<<1)
#define rson (k<<1|1)
#define MEM(a,x) memset(a,x,sizeof a)
#define L ch[r][0]
#define R ch[r][1]
const int N=1000050;
const long long Mod=1000000007;using namespace std;int main() {int t;scanf("%d", &t);rep(z, 0, t) {long long d, k;scanf("%lld%lld", &d, &k);int n = d / (sqrt(2) * k);long long x = (n+1) * k;long long y = n * k;// 判断是否会出现((x+1)k, xk)可行的情况if (x * x + y * y > d * d) {puts("Utkarsh");}else {puts("Ashish");}}return 0;
}

这里有一个小小的坑,就是由于d的范围是1e5,那么当我们计算距离的时候由于用到平方会超过int的范围,所以需要改成long long。

这道题到这里就结束了,我们也可以看得出来,题目本身是不难的,但是解法没有那么容易想到。我个人觉得挺有意思的,希望大家也会喜欢。

牛客网-数据结构笔试题目(三)-博弈论圆圈游戏(Circle Game)(附源码)相关推荐

  1. 牛客网-数据结构笔试题目(一)-猫咪特征提取思路解析(附源码)

    题意 小明是一名算法工程师,同时也是一名铲屎官.某天,他突发奇想,想从猫咪的视频里挖掘一些猫咪的运动信息.为了提取运动信息,他需要从视频的每一帧提取"猫咪特征".一个猫咪特征是一个 ...

  2. 牛客网-数据结构笔试题目(七)-k-amazing数字求解

    题意 给定n个数构成的数字,我们定义一个k-amazing数的概念.如果数a同时出现在数组中所有k个连续元素构成的序列当中,并且a是其中最小的那个,那么就称为a是一个k-amazing数字. 我们抽象 ...

  3. 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)

    题意 现在我们想要在n步这样的神奇异或操作之内让数组当中的所有元素全部相等,请问这一点是否可能呢?首先输出YES或NO,表示是否有解.如果有解输出需要操作的步数,以及对应选择的元素下标. 样例 在第一 ...

  4. 牛客网-数据结构笔试题目(二)-万万没想到之抓捕孔连顺思路解析(附源码)

    题意 我叫王大锤,是一名特工.我刚刚接到任务:在字节跳动大街进行埋伏,抓捕恐怖分子孔连顺.和我一起行动的还有另外两名特工,我提议 我们在字节跳动大街的N个建筑中选定3个埋伏地点. 为了相互照应,我们决 ...

  5. 牛客网-数据结构笔试题目(八)-离子能力跃迁问题求解

    题意 有一个人在玩一个离子激活的游戏,题目的背景是模拟的化学当中的离子能量跃迁.在化学当中,离子吸收能量可以从低能态跃迁到高能态,并且放出一定的能量. 现在有N粒离子排成一排(下标1-N),每一个离子 ...

  6. 牛客网-数据结构笔试题目(六)-最近点对问题求解思路

    题意 我们先来看下题意吧,题意很简单,在一个平面当中分布着n个点.现在我们知道这n个点的坐标,要求找出这n个点当中距离最近的两个点的间距. 分治法 如果我们仔细思考一下,会发现这个问题和排序其实非常类 ...

  7. 牛客网-数据结构笔试题目(五)-动态规划问题求解

    题意 给定n个整数,对于这n个整数我们可以采取两种操作.第一种操作是在数组左侧选择连续的k个整数减1,第二种操作是选择右侧的连续k个整数减1. 比如假设数组是[3, 2, 2, 1, 4],比如我们选 ...

  8. 牛客网 精品课程 《直通BAT面试算法精讲课》 优惠码立减10元

    牛客网 精品课程 <直通BAT面试算法精讲课> 优惠码 专属优惠码为:AszaxMb 或者直接打开专属优惠购课链接: http://www.nowcoder.com/courses/1?c ...

  9. 牛客网校招题题目收集----数据结构与算法篇

    选择题 a,b,c,d,e 对应出现的频率为4,6,11,13,15:以下符合哈夫曼编码的选项是?() A. a=000.b=01.c=001.d=10.e=11 B. a=000.b=001.c=0 ...

最新文章

  1. PHP图片裁剪_图片缩放_PHP生成缩略图
  2. c#测试字符串是否为GUID的几种方法
  3. 初学Java Web(4)——Servlet学习总结
  4. refreshtoken用mysql_「SpringCloud」 Spring Security OAuth2 Mysql管理在线Token
  5. MEP(minimum error pruning) principle with python implemention
  6. jpi多表联查_数据库两表联查、多表联查,多重联查
  7. Arcgis 使用ArcToolbox实现数据统计
  8. PHP 查找链表倒数第i个节点
  9. 中国人工智能学会通讯——AI时代的若干伦理问题及策略 1.3 构建算法治理的内外部约束机制...
  10. Myeclipse中点(.)不出来方法或者属性?
  11. UVA - 10474
  12. 展示魅力东莞,传递亚运激情
  13. 【掩耳盗铃】[转载]北京铁路局:“北京站37号窗口售票员内部大量出票”是为分区售票...
  14. 提升代码格调——JavaScript 数组的 reduce() 方法入门
  15. 基本排序算法比较与选择
  16. psn账号 证明你不是机器人_世界上最聪明的机器人,AlphaGo智能机器人轻松击败世界围棋冠军...
  17. 物联网之有线通信技术之短距离的现场总线
  18. 手把手系列-从零开始手把手教你前后分离网站
  19. 改进YOLOv5!GSConv+Slim Neck进一步提升YOLOv5性能!
  20. secureCRT命令行字符重叠只显示一半

热门文章

  1. 工业交换机的外壳设计重要吗?
  2. 【渝粤教育】国家开放大学2018年春季 7397-21T家庭教育咨询与辅导 参考试题
  3. 【渝粤教育】国家开放大学2018年春季 0675-22T中级财务会计(2) 参考试题
  4. 【渝粤教育】21秋期末考试电算化会计10169k2
  5. 网络 计算机不显示不出来,网页图片显示不出来怎么办 网络故障解决【详解】...
  6. python qtdesigner安装,PyCharm+Qt Designer+PyUIC安装配置教程详解
  7. fceux模拟器linux,超强FC模拟器fceux-2.2.3最新版
  8. 应用程序添加到服务器,在同一应用程序中的配置服务器和eureka服务器:尝试连接到localhost:8761...
  9. laravel5.6 mysql_快速入门 |《Laravel 5.6 中文文档 5.6》| Laravel China 社区
  10. View的三大流程之View的测量