uva 846

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5     int x , y , t;
 6     scanf("%d",&t) ;
 7     while(t--)
 8     {
 9         scanf("%d%d",&x,&y) ;
10         int dis = y-x ;
11         if(dis==0){printf("0
") ; continue ;}
12         int n = 1 ,k;
13         while(1)
14         {
15             k = n*n ;
16             if(dis>k)n++;
17             else break;
18         }
19         n-- ;
20         k = n*n ;
21         if(k==dis)printf("%d
",2*n-1) ;
22         else if(dis-k<n+1)printf("%d
",2*n) ;
23         else printf("%d
",2*n+1) ;
24     }
25     return 0 ;
26 }

假如走的方式为:1+2+3……+(n-1)+  n  +(n-1)……+2+1

此时 dis(走的总距离) = n^2 

当走的方式为:1+2+3……+(n-1)+  n + ( n + 1) + n +(n-1)……+2+1

则此时 dis = ( n+1 )^2 = n^2 + 2*n + 1

所以当:dis - n^2==0 时  steps( 走的步数 ) = 2 * n -1 

     n^2< dis  <=  n^2 + n 时 steps = 2 * n 

    n^2 + n < dis - n^2 <= n^2 + 2*n + 1 时 steps = 2 * n +1 

还有其他方法  貌似也挺好的 :http://www.cppblog.com/syhd142/articles/131861.html?opt=admin

原文地址:https://www.cnblogs.com/shaughn/p/3432194.html