1.B : 如何溜的最快

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值