题目描述
一维的棋盘上有无限多个格子,每个格子都有一个编号,最中间的格子编号为 00 ,00 号格子向右依次编号为 11,22,33,… ,向左依次编号为 −1−1, −2−2, −3−3,… 。
小明的目标是要将一枚棋子从 𝑥x 号格子移动到 𝑦y 号格子。
每一次操作有两种选择:
操作 11 :向右移动 11 个格子。
操作 22 :从当前棋子所在的 𝑎a 号格子,直接跳到 −𝑎−a 号格子(如:可以从 66 直接跳到 −6−6 ,也可以从 −6−6 直接跳到 66 )。
可以证明,无论整数 𝑥x 和 𝑦y 的值是多少,目标总是可以实现的。
请你设计程序,帮小明计算把棋子从 𝑥x 号格子移动到 𝑦y 号格子需要的最少操作次数。
输入格式(输入文件为 chess.in)
一行,两个整数 𝑥x 和 𝑦y , 表示要将棋子从 𝑥x 号格子移动到 𝑦y 号格子。
输出格式(输出文件为 chess.out)
一个整数,表示小明把棋子从 𝑥x 号格子移动到 𝑦y 号格子需要的最少操作次数。
输入样例 #1
10 20
输出样例 #1
10
样例一说明
说明:需要进行1010次操作11。
输入样例 #2
10 -10
输出样例 #2
1
样例二说明
需要进行1次操作2
输入样例 #3
-10 -20
输出样例 #3
12
样例三说明
说明:先进行 11 次操作 22 ,然后进行 1010 次操作 11 ,最后进行 11 次操作 22 。
数据范围
对于 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|。
AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
long long ans,x,y;
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;
}
}
cout<<ans<<"\n";
return 0;
}