CF1657A题解

本文最后更新于:2023年4月26日 晚上

题目大意

这道题的大意是有 \(t\) 组询问,每组询问给出一个坐标 \((x,y)\) ,让你求在每次移动的长度都是整数的情况下,最少经过多少次移动可以回到原点 \((0,0)\)

分析

通过分析题意,我们可以列出以下三种情况:

1、询问的点在原点:一次都不需要移动,直接输出0即可。

2、询问的点和原点的距离为整数:可以通过一个简单的代码段来判断是否是这种情况。

1
2
3
4
5
int x,y;
cin >> x >> y;//输入坐标
int k=sqrt(x*x+y*y);
if(k*k==x*x+y*y) printf("true");//sqrt(x*x+y*y)为整数
else printf("false");

这种情况输出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;
}


CF1657A题解
https://blog.shuger.ml/CF1657A-sol/
作者
_Shu
发布于
2022年4月28日
许可协议