Description
给你一个终点(x,y),从(0,0)出发,每步可以向任意方向沿直线走 恰好为R 的距离,请你输出到达终点所需的最短步数。
Input
多组数据,每组数据输入R,x,y
1 ≤ R ≤ 10^5
0 ≤ x, y ≤ 10^5
(x,y)≠(0,0)
所有输入皆为int型
Output
输出结果并换行
Sample Input
3 4 4
2 1 1
2 2 2
Sample Output
2 2 2
Hint
距离不能恰好走到的情况,可以走折线到达
关于多组数据输入
大多题目读入多组数据的方法为
while(scanf("...") != EOF)
{
...
}
这里 EOF
表示 End of File,即不断读入数据直到结束。
这也是很多同学做简单的 A+B 题目却一直 WA 的原因,没有使用循环,只处理了一组数据。
当然一些题目也会一开始规定数据组数,先读入一个 t,再对t循环。
scanf("%d", &t);
while(t --)
{
// ...
}
一些题目会有显著的结束特征,比如读到0 0
结束,那么按要求判断即可
while(scanf("%d%d", &a, &b) && (a || b))
{
// ...
}
当题目没有明确以某种条件结束输入时, 建议无论题目是否说明单组数据,甚至即使题目已说明单组数据,都使用while(...EOF)
的形式输入 ,兼容单组与多组数据的情况。
代码实现
#include <stdio.h>
#include <math.h>
/*
恰好走r的距离意思是每步能且仅能走r的距离
只能走直线:至于直线与否等步数*步长>=距离后再决定如何走,题目要求的不是如何走而是至少多少步
*/
int main()
{
int r, x, y;
while (scanf("%d%d%d", &r, &x, &y) != EOF)
{
int step = 1;//至少需要一步,因为题目预设终点不等于起点
double z = sqrt(x * x + y * y);//计算距离
if (z < r)
//如果两点距离小于一步能走的距离,则需要两步就能走到
{
step = 2;
}
else
{
while (step * r < z)
//若步数step*每步距离r一直小于两点距离z,则向前迈一步
{
step++;
}
}
printf("%d\n", step);
}
return 0;
}