1057 - 算步数

通过次数

0

提交次数

0

时间限制 : 1 秒 内存限制 : 32 MB

给你坐标轴上的两个点A和B,请问从A走到B最少需要多少步?
我们对走的每一步的步长作出如下限制:
第一步和最后一步的步长必须是1,其他的任意一步的步长必须比前一步的步长小1、大1或相等。

题目输入

输入包含多组测试数据。每组输入两个整数A和B(0<=A<=B<2^31)。

题目输出

对于每组输入,输出从A走到B最少需要多少步。

输入/输出样例

输入格式

45 48
45 49
45 50

输出格式

3
3
4

C语言解答

#include<stdio.h>
#include<math.h>

int main()
{
	int x,y,i,s,d,n;
	while(scanf("%d%d",&x,&y)!=EOF)
	{
		d=y-x;
		n=sqrt(d);
		if(d<4)
			printf("%d\n",d);
		else
		{
			if(d==n*n)
				s=2*n-1;
			else if(d>n*n&&d<=n*n+n)
				s=2*n;
			else
				s=2*n+1;
			printf("%d\n",s);
		}
	}
	return 0;
}

C++解答

#include<stdio.h>
#include<math.h>

int main()
{
	int x,y,i,s,d,n;
	while(scanf("%d%d",&x,&y)!=EOF)
	{
		d=y-x;
		n=sqrt(d);
		if(d<4)
			printf("%d\n",d);
		else
		{
			if(d==n*n)
				s=2*n-1;
			else if(d>n*n&&d<=n*n+n)
				s=2*n;
			else
				s=2*n+1;
			printf("%d\n",s);
		}
	}
	return 0;
}

Java解答

import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int A = in.nextInt();
            int B = in.nextInt();
            if (B - A >= 0 && B - A <= 3) {
                System.out.println(B - A);
                continue;
            }

            int i = 1;
            int a = B - A;
            int res = 0;
            while (a >= 2 * i) {
                a -= 2 * i++;
                res += 2;
            }

            if (a <= i&&a>0) {
                res++;
            } else if (a > i) {
                res += 2;
            }

            System.out.println(res);
        }
    }
}