2010/02/01

Steps

計算兩個數字的距離的最短步數,每一步行走距離只能相差1或是相等。

public class JAVA {

      // 輸入緩衝區 (緩衝空間需要依照題目調整)
      public static byte[] cinbuf = new byte[1024];
     
      // 讀取一個單字 (英文姓名包含空白時請不要用)
      public static String readToken() {
        int offset = 0;
        int bytedata = -1;
        
        try {
          // 略過非單字的字元 '\t','\n','\r',' '
          bytedata = System.in.read();
          while(bytedata==9||bytedata==10||bytedata==13||bytedata==32) {
            bytedata = System.in.read();
          }
     
          // 載入單字的字元
          while(bytedata!=-1) {
            if(bytedata==9||bytedata==10||bytedata==13||bytedata==32) {
              break;
            } else {
              cinbuf[offset++] = (byte)bytedata;
            }
            bytedata = System.in.read();
          }
        } catch(Exception e) {}
        
        if(offset+bytedata==-1) return null; // 串流結束
        return new String(cinbuf,0,offset);
      }
      
      // 讀取一行
      public static String readLine() {
        int offset = 0;
        int bytedata = -1;
        
        try {
          // 載入整行
          bytedata = System.in.read();
          while(bytedata!=-1) {
            if(bytedata==10) {
              break;
            } else {
              cinbuf[offset++] = (byte)bytedata;
            }
            bytedata = System.in.read();
          }
        } catch(Exception e) {}
     
        if(offset+bytedata==-1) return null; // 串流結束
        if(cinbuf[offset-1]=='\r') offset--; // window 要去除 '\r' 字元
        return new String(cinbuf,0,offset);
      }
      
    public static void main(String[] args) {
        
        int testCase = parseInt(readLine());
        
        for(int i = 0; i < testCase; i++) {
            int a = parseInt(readToken());
            int b = parseInt(readToken());
            System.out.println(countStep(b-a));
        }
        
    }
    
    public static int countStep(int diff) {
        
        int step = 0;
        
        if(diff == 0)
            return 0;
        
        step = (int)(Math.sqrt(diff));
        
        if(step * step == diff) 
            step = step * 2 - 1;
        else if(step * step + step < diff)
            step = step * 2 + 1;
        else
            step = step * 2;
        
        return step;
    }

}

No comments:

Post a Comment