题意:给两个点a,b,要求从a移动到b,每次移动步数要比前面的一步大或者等于或者小1。求最小的步数。(第一步和最后一步的必须步数为1)
思路:考虑1,2,,,n-1,n,n-1,,,1这种最优走法,如果比这个走法多j(1<j<=n)步,那么将j加到一边就可以了,如果多j(2*n>=j>n)步,那么一边加一个即可。
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define INF 0x3fffffff
#define clr(s,t) memset(s,t,sizeof(s));
int n;
int main(){
int i,a,b,res;
scanf("%d",&n);
for(i = 1;i<=n;i++){
scanf("%d %d",&a,&b);
if(a==b){
printf("0\n");
continue;
}
b -= a;
a = (int)sqrt((double)b);
res = 2*a-1;
if(a*a+a >= b && b>a*a)
res++;
if(a*a+a<b && b>a*a)
res+=2;
printf("%d\n",res);
}
return 0;
}