2014-10-02 42 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