CodeChef:时间限制超出以下java代码

时间:2015-06-15 11:58:24

标签: java

以下是问题的链接: - http://www.codechef.com/problems/INTEST/

以下是代码: -

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

class INTEST {
    public static void main(String...s) {
        String str = "";
        try {
            str = new BufferedReader(new InputStreamReader(System. in )).readLine();
        } catch (Exception e) {
            System.out.println(e);
        }
        String[] ar = str.split(" ");

        int n = Integer.parseInt(ar[0]);
        int k = Integer.parseInt(ar[1]);
        int count = 0;
        if (k <= 10000000) {
            int[] t = new int[n];

            for (int i = 0; i <= n - 1; i++) {
                try {
                    t[i] = Integer.parseInt(new BufferedReader(new InputStreamReader(System. in )).readLine());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (t[i] <= 1000000000) {
                    if (t[i] % k == 0) count++;

                } else break;
            }
        }
        System.out.println(count);

    }
}

我从Scanner更改为BufferedReader以读取数据,但它可能无助于减少时间。

任何帮助我如何减少时间。感谢。

问题:

此问题的目的是验证用于读取输入数据的方法是否足够快以处理带有巨大输入/输出警告的问题。您应该能够在运行时每秒处理至少2.5MB的输入数据。

输入

输入以两个正整数n k(n,k <= 10 ^ 7)开始。 接下来的n行输入包含一个正整数ti,每个不大于10 ^ 9。

输出

写一个整数到输出,表示有多少整数ti可以被k整除。 实施例

输入: 7 3

1

51

966369

7

9

999996

11

输出:

4

2 个答案:

答案 0 :(得分:1)

对象初始化成本很高(即使用new)。你应该尽可能地避免这种情况)。在这种情况下,您可以创建一个Scanner对象并重复使用它。

例如

class INTEST {
    public static void main(String...s) {
        String str = "";
         Scanner input=new Scanner(System.in);
        try {
            str = input.readLine();
        } catch (Exception e) {
            System.out.println(e);
        }
        String[] ar = str.split(" ");

        int n = Integer.parseInt(ar[0]);
        int k = Integer.parseInt(ar[1]);
        int count = 0;
        if (k <= 10000000) {
            int[] t = new int[n];

            for (int i = 0; i <= n - 1; i++) {
                try {
                    t[i] = Integer.parseInt(input.readLine());
                } catch (Exception e) {
                    e.printStackTrace();
                }
                if (t[i] <= 1000000000) {
                    if (t[i] % k == 0) count++;

                } else break;
            }
        }
        System.out.println(count);

    }
}

注意: 还有更多的优化可以给代码。例如,使用nextInt代替nextLine,然后转换为integer。此外,您始终可以承担输入,您无需一直检查值。

答案 1 :(得分:0)

这是成功运行的最终优化解决方案:)

 import java.util.*;
 import java.text.*;
 import java.io.*;

class INTEST{
public static void main(String... s) {
String str="";
try{
str = new BufferedReader(new InputStreamReader(System.in)).readLine();
}catch(Exception e){System.out.println(e);}
String[] ar = str.split(" ");

int n = Integer.parseInt(ar[0]);
int k = Integer.parseInt(ar[1]);
int count = 0;
if(k<=10000000){
int t=0;
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

for(int i=0;i<=n-1;i++){
try{
t  = Integer.parseInt(bf.readLine()) ;
}catch(Exception e){e.printStackTrace();}

 if(t<=1000000000)  
{
if(t%k==0)
count++;
} 
else break;
}}

System.out.println(count);

}}