时间限制:1秒 内存限制:128M
题目描述
一维的棋盘上有无限多个格子,每个格子都有一个编号,最中间的格子编号为 0 ,0 号格子向右依次编号为 1,2,3,… ,向左依次编号为 −1, −2, −3,… 。
小明的目标是要将一枚棋子从 𝑥 号格子移动到 𝑦 号格子。
每一次操作有两种选择:
操作 1 :向右移动 1 个格子。
操作 2 :从当前棋子所在的 𝑎 号格子,直接跳到 −𝑎 号格子(如:可以从 6 直接跳到 −6 ,也可以从 −6 直接跳到 6 )。
可以证明,无论整数 𝑥 和 𝑦 的值是多少,目标总是可以实现的。
请你设计程序,帮小明计算把棋子从 𝑥号格子移动到 𝑦 号格子需要的最少操作次数。
输入格式(输入文件为 chess.in)
一行,两个整数 𝑥和 𝑦 , 表示要将棋子从 𝑥 号格子移动到 𝑦 号格子。
输出格式(输出文件为 chess.out)
一个整数,表示小明把棋子从 𝑥 号格子移动到 𝑦 号格子需要的最少操作次数。
输入样例 #1
10 20
输出样例 #1
10
样例一说明
说明:需要进行10次操作1。
输入样例 #2
10 -10
输出样例 #2
1
样例二说明
需要进行1次操作2
输入样例 #3
-10 -20
输出样例 #3
12
样例三说明
说明:先进行 1 次操作 2 ,然后进行 10 次操作 1 ,最后进行 1 次操作 2 。
数据范围
对于 30% 的数据:|x|≤100,|y|≤100 ;
对于 100% 的数据:𝑥,𝑦x,y都为整数;|x| ≤ 10^9,|y|≤10^9;𝑥,𝑦x,y不相等。
有 40% 的数据,|x|>|y|。
有 40% 的数据,|x|<|y|。
有 20% 的数据,|x|=|y|。
本题需要分情况讨论,枚举即可。
代码奉上
#include<iostream>
#include<cmath>
using namespace std;
long long x,y,ans;
int main(){
cin>>x>>y;
long long len=abs(abs(x)-abs(y));
if(x*y>0){//同号
if(x>y) ans=len+2;
else ans=len;
}else if(x*y<0){//异号
ans=len+1;
}else{
if(x<y) ans=len;
else ans=len+1;
}
return 0;
}