题目描述
给你坐标轴上的两个点A和B,请问从A走到B最少需要多少步?
我们对走的每一步的步长作出如下限制:
第一步和最后一步的步长必须是1,其他的任意一步的步长必须比前一步的步长小1、大1或相等。
输入
输入包含多组测试数据。每组输入两个整数A和B(0<=A<=B<2^31)。
输出
对于每组输入,输出从A走到B最少需要多少步。
样例输入 Copy
45 48
45 49
45 50
样例输出 Copy
3
3
4
代码
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
int n=abs(a-b);
if(n==0){
printf("0\n");
}
else{
int ze=sqrt(n);
int s=ze*ze;
int bu=2*ze-1;
if(n>s && n<=s+ze){
bu++;
}
else if(n>s+ze){
bu+=2;
}
printf("%d\n",bu);
}
}
return 0;
}
#include<cstdio>
using namespace std;
int main()
{
long int a, b;
while (scanf("%ld%ld", &a, &b) != EOF){
long int step = b-a;
if(step == 0) {puts("0");continue;}
long int n = 0;
while (n*n <= step) {n++;}
n--;
long int left = step - n*n;
long int add1 = left / n;
long int add2 = left % n;
long int ans = 2*n-1+add1;
if(add2) ans += 1;
printf("%ld\n",ans);
}
}