2014-02-21 43 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