我的程序运行正常,但我有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);
}
}
}
}
答案 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[]
的调用。