CF1657A题解
本文最后更新于:2023年4月26日 晚上
题目大意
这道题的大意是有 \(t\) 组询问,每组询问给出一个坐标 \((x,y)\) ,让你求在每次移动的长度都是整数的情况下,最少经过多少次移动可以回到原点 \((0,0)\) 。
分析
通过分析题意,我们可以列出以下三种情况:
1、询问的点在原点:一次都不需要移动,直接输出0即可。
2、询问的点和原点的距离为整数:可以通过一个简单的代码段来判断是否是这种情况。
1 | |
这种情况输出1即可。
3、询问的点和原点的距离不为整数:这种情况略微复杂一些,但是仔细分析也可以得到答案。
在这种情况下,想1步移动到原点是不可能的了,那么就往尽量少的步数上想。
通过思考,我们可以发现,对于坐标 \((x,y)\) ,在 \(x\) 和 \(y\) 都不为0的情况下,可以先将点移动到 \(x\) 轴上,即将横坐标变为0,接下来1步就可以将点移动到 \(y\) 轴上了,于是这种情况输出2就可以了。
code: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include<stdio.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
signed main() {
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
int t;
cin >> t;//多组询问
while(t--) {
int x,y;
cin >> x >> y;
if(x==0 && y==0) cout << "0\n";
else {
int k=sqrt(x*x+y*y);
if(k*k==x*x+y*y) {//判断距离原点的距离是否是整数
cout << "1\n";
}
else cout << "2\n";
}
}
return 0;
}