如何提高我的程序进行时间?

时间:2017-09-27 10:23:00

标签: java

我的程序运行正常,但我有3020ms的时间限制。如何改进我的代码?

https://www.e-olymp.com/uk/problems/3607

n-是一些人,然后有n个输入来描述他们的身高,程序应该回答一个人在a和b之间有多少高度的问题(也在输入中给出)

 import java.io.PrintWriter;
 import java.util.Scanner;

 public class OlimpGames {
    public static void main(String[] args) {
      Scanner in = new Scanner(System.in);
      PrintWriter out = new PrintWriter(System.out, true);
       {
        while (in.hasNextInt()) {
            int n = in.nextInt();

            int heigh[] = new int[100];
            for (int i = 0; i < n; i++) {
                heigh[in.nextInt() - 150]++;
            }
            int a = in.nextInt();
            int b = in.nextInt();

            int an = 0;
            for (int i = a - 150; i <= b - 150; i++) {
                an = an + heigh[i];
            }
            System.out.println(an);
        }

    }
  }
}

1 个答案:

答案 0 :(得分:0)

问题:输入集是一个重复3行的列表,第一行指定X个人(最多20,000个),他们的高度以厘米为单位跟随下一行(高度在150到250厘米之间),你需要计算在第三行指定的Y和Z之间的高度的人数。

首先,由于他们构建数据集的狡猾方式(您无法访问),这些编程竞赛可能会出类拔萃。

我建议你以两种方式改进你的计划。

首先,使用比Scanner更好的解析器 - 与其他解析器相比,它的速度很慢。

Why is Scanner slower than BufferedReader?

其次,您可以完全避免使用阵列存储。您需要在第二行之前处理输入的第三行行,并读取“min”和“max”。

然后,您可以浏览输入的第二个行(最多可包含20,000个项目),并计算min和max之间的项目(不包含数组存储 - 摆脱{{1完全)。这将在处理每3行输入时释放对heigh[]的调用。