2014-10-02 43 views
-1

我正試圖解決CodeChef的練習問題。在這個問題中,我們給出N個數字A i ... A n我們首先必須對數字進行排序(升序),然後從最後一個開始添加備用數字並顯示每個測試用例的輸出,測試用例有2個部分組成:
1>約束:
1≤艾≤10
1≤N≤1000在CodeChef中獲取TLE並需要改進代碼

2>約束:
1≤艾≤10
1≤N≤10
您可以看到完整問題here
我的問題的第一部分是成功提交,但第二部分顯示NZEC因爲我使用long添加這些數字(超出該範圍)。所以我決定用字符串來這裏加了我的號碼是方法:

public static String myStringWayToAdd(String first , String second){ 
    String temp = ""; 
    if(first.length() < second.length()){ 
    temp = first; 
    first = second; 
    second = temp; 
    } 
    temp = ""; 
    int carry = 0; 
    for(int i=1;i<=first.length();++i){ 
     if(i <= second.length()){ 
      carry += Integer.parseInt(first.charAt(first.length()-i)+"") + Integer.parseInt(second.charAt(second.length()-i)+""); 
     } 
     else{ 
     carry += Integer.parseInt(first.charAt(first.length()-i)+""); 
     } 
    temp += carry%10; 
    carry = carry/10; 
    } 
    if(carry != 0) 
    temp += carry; 
    StringBuilder myResult = new StringBuilder(temp); 
    return(myResult.reverse().toString()); 
} 

但現在它顯示TLE(期限到期),於是我想到要用BigInteger的(這我不是非常意識到但我看到一些教程):

BigInteger big = new BigInteger("0"); 
big = big.add(BigInteger.valueOf(mySort.get(j))); //for addition and mySort is my ArrayList 

但這給我NZEC我不知道爲什麼
現在好了,我想用double可變的,但有一個問題,太多,因爲與d ouble大量將在指數值喜歡的形式:
1.243536E15接受了機器,所以有以什麼好辦法解決這個問題,並沒有得到任何期限屆滿?
任何幫助將真正被讚賞。先謝謝你。


編輯1:
我改變了可變baxck長和運行,這一次奇怪的是我得到 TLE這裏是我的代碼:

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Collections; 
import java.math.BigInteger; 
import java.lang.Number; 
class CFEA{ 
    public static void main(String[] s){ 
    Scanner scan = new Scanner(System.in); 
    int testCases = scan.nextInt(); 
    for(int i = 0 ; i<testCases;++i){ 
    long sum = 0; 
    //BigInteger big = new BigInteger("0"); 
    ArrayList<Integer> mySort = new ArrayList<Integer>(); 
    int n = scan.nextInt(); 
     for(int j = 1 ; j <= n ; ++j){ 
     mySort.add(scan.nextInt()); 
     } 
    Collections.sort(mySort); 
     for(int j = mySort.size()-1 ; j >= 0 ; j=j-2){ 
     sum += mySort.get(j); 
     } 
    System.out.println(sum); 
    } 
    } 
} 

這裏是Link我submission.Is有任何我可以在我的代碼優化?

回答

0

我確實在我的計劃有些變化,並利用約20倍後,這是所有接受大大緩解,這是我的新代碼:

import java.util.Scanner; 
import java.util.ArrayList; 
import java.util.Collections; 
class CFEA{ 
    public static void main(String[] s){ 
    Scanner scan = new Scanner(System.in); 
    byte testCases = Byte.parseByte(scan.nextLine()); //used byte for test cases instead of int 
    for(int i = 0 ; i<testCases;++i){ 
    long sum = 0; 
    //BigInteger big = new BigInteger("0"); 
    ArrayList<Integer> mySort = new ArrayList<Integer>(); 
    int n = Integer.parseInt(scan.nextLine()); 
    String input = scan.nextLine(); 
    String[] my = input.split(" "); 
     for(String myString : my){ 
     mySort.add(Integer.parseInt(myString)); 
     } 
    Collections.sort(mySort); 
     for(int j = mySort.size()-1 ; j >= 0 ; j=j-2){ 
     sum += mySort.get(j); 
     } 
    System.out.println(sum); 
    } 
    } 
} 

我認爲主要小人是我是掃描整數n的次數如在此:

for(int j = 1 ; j <= n ; ++j){ 
     mySort.add(scan.nextInt()); 
     } 

當N是像100000那麼這確實減慢它down.So我用1個字符串的整條生產線,然後將其拆分成整數使用split方法如下所示:

String input = scan.nextLine(); //only 1 Scanner 
    String[] my = input.split(" "); 
     for(String myString : my){ 
     mySort.add(Integer.parseInt(myString)); 
     } 

雖然我的代碼了提交我仍然認爲有進一步的優化範圍,所以如果你有更好的東西請做回答

1
  1. 總數最多爲10^9 * 10^5 = 10^14。它足夠小以適應long。沒有必要使用BigInteger

  2. java.util.Scanner有性能問題。您可以實施自定義掃描程序(使用BufferedReader)來加速您的代碼。

這是我實現掃描儀:

import java.io.*; 
import java.util.StringTokenizer; 

public class FastScanner { 
    private BufferedReader reader; 
    private StringTokenizer tokenizer; 

    public FastScanner(InputStream inputStream) { 
     reader = new BufferedReader(new InputStreamReader(inputStream)); 
    } 

    public String next() throws IOException { 
     while (tokenizer == null || !tokenizer.hasMoreTokens()) { 
      String line = reader.readLine(); 
      if (line == null) 
       throw new IOException(); 
      tokenizer = new StringTokenizer(line); 
     } 
     return tokenizer.nextToken(); 
    } 

    public int nextInt() throws IOException { 
     return Integer.parseInt(next()); 
    } 

    public void close() { 
     try { 
      reader.close(); 
     } catch (IOException e) { 
      //ignore 
     } 
    } 
} 
+0

所以我的問題也許是別的東西 – 2014-10-02 17:25:30

+0

@NawedShaikh是的,它不是'長'溢出。 – kraskevich 2014-10-02 17:26:15

+0

奇怪的是,這次我也得到了TLE – 2014-10-02 17:28:53