题目链接

题目描述
有一张无限大的棋盘,你要将马从(0,0)移到(n,m)。
每一步中,如果马在(x,y),你可以将它移动到(x+1,y+2),(x+1,y-2),(x-1,y+2),(x-1,y-2),(x+2,y+1),(x+2,y-1),(x-2,y+1)或(x-2,y-1)。
你需要最小化移动步数。
输入描述:
第一行一个整数t表示数据组数 (1≤ t≤ 1000)。
每组数据一行两个整数n,m (|n|,|m|≤ 10$$$^9$$$)。
输出描述:
每组数据输出一行一个整数表示最小步数。
输入
2
0 4
4 2
输出
2
2
题意
使用最少步数把“马”从(0,0)走到(n,m)
分析
遇事不决先打个表。(请原谅我的作图水平,原点在左上角)

最先发现当n+m=3k时,只用k步就能走到,但前提是每走一步,马和终点的曼哈顿距离都减少3,因此只对介于n=2m和m=2n之间的点满足。
有了这个性质以后,进一步还可以发现,在分界线内部,贪心地走,n+m=3k+1上的点只需要从n+m=3k上的点再走一步就能到,n+m=3k+2上的点从n+m=3k上的点再走两步就能到。所以,求解介于n=2m和m=2n之间的点完成了。
以上是在打表之前分析出来,打表之后得到验证的,接下来是分界线外部的点,打表后意外发现是以4个为整体在有规律的变化。

  • 当n=0时,从m=2开始形成循环节,假设用p表示m在第几节,r表示m是节内第几个,那么p=(m-2)/4,r=(m-2)%4,(0,m)的值就是2+2p+(r&1);
  • 当n>0时,从m=2n开始形成循环节,同样求出p=(m-2n)/4,r=(m-2n)%4,那么(n,m)的值就是n+2p+r;

因为n和m对称求解方法是一样的,所以求解边界外的点也完成了(还有四个特例需要特判一下)。
PS:(2,2)很特殊,它不能在n+m=3的基础上,再一步走到的原因是,它需要的点位于(3,0)和(0,3),而这两个点超出了边界,但对于其他点是都能在n+m=3k上找到点的。

总结
看不懂标答怎么办,好像在乱搞的路上越走越远了
代码
#include<stdio.h>
int main() {
int T, n, m;
int px, rx;
for (scanf("%d", &T); T; T--) {
scanf("%d %d", &n, &m);
if (n<)n = -n; if (m<)m = -m;
if (n + m == )printf("0\n");
else if (n + m == )printf("3\n");
else if (n == && m == )printf("2\n");
else if (n == && m == )printf("4\n");
else if (m <= * n&&n <= * m)
printf("%d\n", (m + n) / + (m + n) % );
else if (m == ) {
px = (n - ) / , rx = (n - ) % ;
printf("%d\n", * px + + (rx & ));
}
else if (n == ) {
px = (m - ) / , rx = (m - ) % ;
printf("%d\n", * px + + (rx & ));
}
else if (m> * n) {
px = (m - * n) / , rx = (m - * n) % ;
printf("%d\n", n + px * + rx);
}
else if (n> * m) {
px = (n - * m) / , rx = (n - * m) % ;
printf("%d\n", m + px * + rx);
}
}
}

nowcoder 203A Knight(贪心+打表)的更多相关文章

  1. [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)

    [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...

  2. Hdu 5289-Assignment 贪心,ST表

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...

  3. Codeforces 980E The Number Games 贪心 倍增表

    原文链接https://www.cnblogs.com/zhouzhendong/p/9074226.html 题目传送门 - Codeforces 980E 题意 $\rm Codeforces$ ...

  4. HDU3183 贪心/RMQ-ST表

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. B - 小Y上学记——小Y的玩偶

    B - 小Y上学记——小Y的玩偶 Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others) ...

  6. SQL面经汇总

    转载链接:https://www.nowcoder.com/discuss/95812 目前的打算是还要写一个假设检验的汇总和机器学习的汇总. 之前写的概率论汇总: https://www.nowco ...

  7. P1463 [HAOI2007]反素数

    题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...

  8. P3052 [USACO12MAR]摩天大楼里的奶牛(迭代加深搜索)

    (已经一句话了) 第一反应:暴力 第二反应:朴素算法过不去 第三反应:没法折半暴搜(没法统计答案) 所以,歪歪了一个类似贪心刷表的方法,过了这道题. 首先,如果爆搜的话会有几个状态: 当前牛 当前几个 ...

  9. P2060 马步距离(洛谷)

    我们无论遇到什么困难,都不要拖,微笑着面对他,战胜拖延的最好方法就是面对拖延. 今天又拖延了…… 早晨听完老师讲课,本想做一道题练练手的,结果因为懒,瘫了一上午.最后在固定的刷题时间去面对了这道题,然 ...

随机推荐

  1. [VB.NET][C#]调用API获取或设置键盘按键状态

    前言 通过 C# 或 VB.NET,你只需编写少量的代码即可实现一个按键精灵. 第一节 接口 调用系统 API 实现获取或设置指定的按键状态. 获取按键状态 调用 GetAsyncKeyState() ...

  2. Jmeter+Badboy安装使用文档

                  Jmeter+Badboy安装使用文档       目录   1.jmeter安装    1 2.Jmeter基础使用    3 3. 使用Jmeter进行分布式测试    ...

  3. Jenkins管理插件(备份插件)

    Jenkins管理插件 为了让所有的插件在 Jenkins 内可用,所有插件的列表可以访问链接 − https://wiki.jenkins-ci.org/display/JENKINS/Plugin ...

  4. 《杜增强讲Unity之Tanks坦克大战》7-坦克血条

    7 坦克血条 点击菜单GameObject->UI->Slider创建Slider   选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...

  5. RobotFramework测试环境搭建记录

    Robotframwork测试环境搭建记录 1.安装Python2.7(https://www.python.org/) 在环境变量path中加入“C:\Python27” 安装后的验证方法为在命令行 ...

  6. Spring中的数据库事物管理

    Spring中的数据库事物管理 只要给方法加一个@Transactional注解就可以了 例如:

  7. 环境变量的配置-java-JMETER - 【Linux】

    rz上传 lz下载 步骤: . Linux下首先安装Jdk: . 下载apache-jmeter-4.0.tgz,复制到Linux系统中的/opt目录下: . 解压apache-jmeter-4.0. ...

  8. Linux——CentOS7添加/删除用户和用户组(学习笔记)

    1.新建用户 adduser testuser //新建testuser 用户 passwd testuser //给testuser 用户设置密码 2.建工作组 groupadd testgroup ...

  9. 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname

    之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties 中配置自己的 IP. 至于为什么要这么做,源于这一次 debug 的过程. 运行环境 mint, ...

  10. uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...