2014-02-21 41 views
-3

我目前正在研究网上法官的问题。但是,我的代码一直超过TimeLimit,这只有1秒。我已经使用了ScannerSystem.out.print()但是我被告知这样的方法会让我的代码更慢,并且会消耗更多的内存,这就是我缓冲输入和输出的方式。我不能使用类型,如longint,因为存储变量的数据比这些值长。如何优化我的代码以使其更快?

下面是代码:

import java.io.*; 
import java.math.BigDecimal; 

class Main { 
    public static void main(String[] args) throws NumberFormatException, IOException{ 
     java.io.InputStreamReader iSR = new java.io.InputStreamReader(System.in); 
     java.io.BufferedReader bR = new java.io.BufferedReader(iSR, 16 * 1024); 
     BufferedWriter bW = new BufferedWriter(new OutputStreamWriter(System.out)); 
     String tL; 
     BigDecimal PRA = BigDecimal.ZERO, PRB = BigDecimal.ZERO, PA = BigDecimal.ZERO, PB = BigDecimal.ZERO; 
     int input = Integer.parseInt(bR.readLine()); 
     for(int j = 0; j < input; j++){ 
      tL = bR.readLine(); 
      String [] = arr = tL.split(" "); 
      PA = BigDecimal.valueOf(Integer.parseInt(arr[0])); 
      PB = BigDecimal.valueOf(Integer.parseInt(arr[1])); 
      PRA = BigDecimal.valueOf(Double.parseDouble(arr[2])); 
      PRB = BigDecimal.valueOf(Double.parseDouble(arr[3])); 
      PRA = PRA.divide(BigDecimal.valueOf(100)); PRA = PRA.add(BigDecimal.ONE); 
      PRB = PRB.divide(BigDecimal.valueOf(100)); PRB = PRB.add(BigDecimal.ONE); 
      int i = 1; 
      while(PA.compareTo(PB) < 0 && i < 103){ 
       BigDecimal ibd = BigDecimal.valueOf(i); 
       PA = PA.multiply(PRA).multiply(ibd); 
       PB = PB.multiply(PRB).multiply(ibd); 
       i++; 
      } 
      i--; 
      if(i > 100) bW.write("Mais de 1 seculo.\n"); 
      else bW.write(String.valueOf(i) + " anos.\n"); 
      bW.flush(); 
     } 
    } 
} 
+0

''我目前正在研究网上法官的问题。“' - 如果这是在线比赛,你不应该自己解决这个问题吗?就是想。 –

+0

@HovercraftFullOfEels不是比赛。我只是在练习,无论如何感谢您的疑惑。 – Hans

+0

这是什么... – Shahar

回答

3

一点..

你不应该做tL.split("\\s")多次。只需做一次,将其分配给一个变量并使用它。

+0

其实,如果我按照你的建议,我会创建一个新的实例,这无济于事。感谢您的帮助。 – Hans

+0

@Hans:相反,按照你的方式,你创建了四个新的实例,而不是一个。不能说的方式显然更好,显然* *有帮助。 –

+0

@HovercraftFullOfEels而不是创建5个实例,我创建4. – Hans