2015-11-30 5 views
0

Простое изменение метода свопа A для замены метода B, судья UVa переходит от «Неверный ответ» к «Принято». Почему это? Я благодарю всех вас за ваши ответы.Почему метод Недостаток по сравнению с B для онлайн-судьи UVa 100 (3n + 1)?

import java.io.IOException; 
import java.util.StringTokenizer; 

/** 
* @author Coder47 
* Another solution to 3n+1 (UVa ID: 100) 
*/ 
class Main { 
    public static int[] cache = new int[1000000]; 
    static String ReadLn (int maxLg) // utility function to read from stdin 
    { 
     byte lin[] = new byte [maxLg]; 
     int lg = 0, car = -1; 

     try 
     { 
      while (lg < maxLg) 
      { 
       car = System.in.read(); 
       if ((car < 0) || (car == '\n')) break; 
       lin [lg++] += car; 
      } 
     } 
     catch (IOException e) 
     { 
      return (null); 
     } 

     if ((car < 0) && (lg == 0)) return (null); // eof 
     return (new String (lin, 0, lg)); 
    } 

    public static void main(String[] args) { 
     Main myWork = new Main(); // create a dynamic instance 
     myWork.Begin();   // the true entry point 
    } 

    void Begin() { 
     String input; 
     StringTokenizer idata; 
     // corresponds to swap method A 
     int a, b, temp, cycle, cycleMax; 
     // corresponds to swap method B 
     // int a, b, min, max, cycle, cycleMax; 

     while ((input = Main.ReadLn(255)) != null) 
     { 
      idata = new StringTokenizer(input); 
      a = Integer.parseInt(idata.nextToken()); 
      b = Integer.parseInt(idata.nextToken()); 
      // swap method A 
      if (b < a) { 
       temp = a; 
       a = b; 
       b = temp; 
      } 

      // swap method B 
      // min = Math.min(a, b); 
      // max = Math.max(a, b); 
      cycleMax = 0; 
      // corresponds to swap method A 
      for (int i = a; i <= b; i++) 
      // corresponds to swap method B 
      // for (int i = min; i <= max; i++) 
      { 
       cycle = calculateCycle(i); 
       if (cycle > cycleMax) { 
        cycleMax = cycle; 
       } 
      } 
      System.out.println (a + " " + b + " " + cycleMax); 
     } 
    } 

    public int calculateCycle(int n) { 
     return calculateCycleHelper(n, 1); 
    } 

    public int calculateCycleHelper(int n, int cycleNum) { 
     if (n == 1) { 
      return cycleNum; 
     } else { 
      return calculateCycleHelper(next(n), cycleNum + 1); 
     } 
    } 

    public int next(int n) { 
     if (n % 2 == 0) { 
      n = n/2; 
     } 
     else { 
      n = 3*n+1; 
     } 
     return n; 
    } 
} 

Пожалуйста, обратите внимание на эффективность и другие связанные с этим проблемы кода, так как это не проблема.

ответ

3

Это потому, что if (a < b) говорит противоположное тому, что вы хотите. Вам нужно поменять местами элементы, если b < a, потому что в течение цикла

for (int i = a; i <= b; i++) 

вы хотите a быть меньше, чем b.

EDIT

Для обновленного вопроса, ответ в том, что это потому, что судья проверяет выход. Если поменять местами a и b выход из линии

System.out.println (a + " " + b + " " + cycleMax); 

изменения, поэтому судья не принимает его.

+0

И с этим оно установлено: я идиот. Спасибо огромное! – Coder47

+0

@ Coder47 Нет, мы все так поступили! Не забывайте, что вы можете принять ответ (отметьте галочку рядом с ним), если это поможет. –

+0

Собственно, нет. Я беру это обратно. Я неправильно написал свой код выше: даже если это так (b Coder47