nowcoder 203A Knight(贪心+打表)
每一步中,如果马在(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)。
你需要最小化移动步数。
每组数据一行两个整数n,m (|n|,|m|≤ 10$$$^9$$$)。
0 4
4 2
2

最先发现当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(贪心+打表)的更多相关文章
- [BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆)
[BZOJ 2006] [NOI 2010]超级钢琴(贪心+ST表+堆) 题面 给出一个长度为n的序列,选k段长度在L到R之间的区间,一个区间的值等于区间内所有元素之的和,使得k个区间的值之和最大.区 ...
- Hdu 5289-Assignment 贪心,ST表
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...
- Codeforces 980E The Number Games 贪心 倍增表
原文链接https://www.cnblogs.com/zhouzhendong/p/9074226.html 题目传送门 - Codeforces 980E 题意 $\rm Codeforces$ ...
- HDU3183 贪心/RMQ-ST表
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- B - 小Y上学记——小Y的玩偶
B - 小Y上学记——小Y的玩偶 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) ...
- SQL面经汇总
转载链接:https://www.nowcoder.com/discuss/95812 目前的打算是还要写一个假设检验的汇总和机器学习的汇总. 之前写的概率论汇总: https://www.nowco ...
- P1463 [HAOI2007]反素数
题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4. 如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6 ...
- P3052 [USACO12MAR]摩天大楼里的奶牛(迭代加深搜索)
(已经一句话了) 第一反应:暴力 第二反应:朴素算法过不去 第三反应:没法折半暴搜(没法统计答案) 所以,歪歪了一个类似贪心刷表的方法,过了这道题. 首先,如果爆搜的话会有几个状态: 当前牛 当前几个 ...
- P2060 马步距离(洛谷)
我们无论遇到什么困难,都不要拖,微笑着面对他,战胜拖延的最好方法就是面对拖延. 今天又拖延了…… 早晨听完老师讲课,本想做一道题练练手的,结果因为懒,瘫了一上午.最后在固定的刷题时间去面对了这道题,然 ...
随机推荐
- [VB.NET][C#]调用API获取或设置键盘按键状态
前言 通过 C# 或 VB.NET,你只需编写少量的代码即可实现一个按键精灵. 第一节 接口 调用系统 API 实现获取或设置指定的按键状态. 获取按键状态 调用 GetAsyncKeyState() ...
- Jmeter+Badboy安装使用文档
Jmeter+Badboy安装使用文档 目录 1.jmeter安装 1 2.Jmeter基础使用 3 3. 使用Jmeter进行分布式测试 ...
- Jenkins管理插件(备份插件)
Jenkins管理插件 为了让所有的插件在 Jenkins 内可用,所有插件的列表可以访问链接 − https://wiki.jenkins-ci.org/display/JENKINS/Plugin ...
- 《杜增强讲Unity之Tanks坦克大战》7-坦克血条
7 坦克血条 点击菜单GameObject->UI->Slider创建Slider 选中EventSystem,设置Horizontal Axis为HorzontalUI,Vertic ...
- RobotFramework测试环境搭建记录
Robotframwork测试环境搭建记录 1.安装Python2.7(https://www.python.org/) 在环境变量path中加入“C:\Python27” 安装后的验证方法为在命令行 ...
- Spring中的数据库事物管理
Spring中的数据库事物管理 只要给方法加一个@Transactional注解就可以了 例如:
- 环境变量的配置-java-JMETER - 【Linux】
rz上传 lz下载 步骤: . Linux下首先安装Jdk: . 下载apache-jmeter-4.0.tgz,复制到Linux系统中的/opt目录下: . 解压apache-jmeter-4.0. ...
- Linux——CentOS7添加/删除用户和用户组(学习笔记)
1.新建用户 adduser testuser //新建testuser 用户 passwd testuser //给testuser 用户设置密码 2.建工作组 groupadd testgroup ...
- 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname
之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties 中配置自己的 IP. 至于为什么要这么做,源于这一次 debug 的过程. 运行环境 mint, ...
- uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法
如果在编译MFC程序的时候出现下列及类似的错误: 1>uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator ...