被卡性能的时候要care数据类型(洛谷P5594TLE+RE的经历)
程序员文章站
2024-03-17 21:08:52
...
题目内容
对题目的含义理解错误
看代码~~我以为是统计一下多少人在那天,觉得这个pageNum没大用,结果是我错了……
下为代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int studentNum = scanner.nextInt();
int pageNum = scanner.nextInt();
int dayNum = scanner.nextInt();
int[] dayArray = new int[dayNum];
for (int i = 0; i < studentNum; i++) {
for (int j = 0; j < pageNum; j++) {
int temp = scanner.nextInt();
dayArray[temp-1]++;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < dayNum-1; i++) {
result.append(dayArray[i]).append(" ");
}
result.append(dayArray[dayNum-1]);
System.out.println(result);
scanner.close();
}
}
测试:
显然,结果是不对的……
更正后的自测
结尾一个数不对,查看代码,发现bug:
第一次提交——TLE警告
代码是这样的:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int studentNum = scanner.nextInt();
int pageNum = scanner.nextInt();
int dayNum = scanner.nextInt();
int[][] dayArray = new int[dayNum][pageNum];
for (int i = 0; i < studentNum; i++) {
for (int j = 0; j < pageNum; j++) {
int temp = scanner.nextInt();
dayArray[temp-1][j]++;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < dayNum-1; i++) {
int count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[i][j] != 0) {
count++;
}
}
result.append(count).append(" ");
}
int count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[dayNum-1][j] != 0) {
count++;
}
}
result.append(count);
System.out.println(result);
scanner.close();
}
}
第二次提交——TLE×3暴击
本蒟蒻没想到,boolean比int还慢,醉了:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int studentNum = scanner.nextInt();
int pageNum = scanner.nextInt();
int dayNum = scanner.nextInt();
boolean[][] dayArray = new boolean[dayNum][pageNum];
for (int i = 0; i < studentNum; i++) {
for (int j = 0; j < pageNum; j++) {
int temp = scanner.nextInt();
dayArray[temp-1][j]=true;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < dayNum-1; i++) {
int count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[i][j]) {
count++;
}
}
result.append(count).append(" ");
}
int count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[dayNum-1][j]) {
count++;
}
}
result.append(count);
System.out.println(result);
scanner.close();
}
}
第三次提交——RE,宁真狼
这次直接byte,我们既然不想优化算法,那就优化数据类型吧,哈哈:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
byte studentNum = scanner.nextByte();
byte pageNum = scanner.nextByte();
byte dayNum = scanner.nextByte();
byte[][] dayArray = new byte[dayNum][pageNum];
for (int i = 0; i < studentNum; i++) {
for (int j = 0; j < pageNum; j++) {
int temp = scanner.nextInt();
dayArray[temp-1][j]++;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < dayNum-1; i++) {
byte count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[i][j] != 0) {
count++;
}
}
result.append(count).append(" ");
}
byte count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[dayNum-1][j] != 0) {
count++;
}
}
result.append(count);
System.out.println(result);
scanner.close();
}
}
盲测是超byte范围了,可我真的忘了byte的大小诶,测一下~~
自检:
复习一下,byte在-128~127,宁真行……
第四次提交——AC之道,在于Short
附上AC代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
short studentNum = scanner.nextShort();
short pageNum = scanner.nextShort();
short dayNum = scanner.nextShort();
short[][] dayArray = new short[dayNum][pageNum];
for (int i = 0; i < studentNum; i++) {
for (int j = 0; j < pageNum; j++) {
int temp = scanner.nextInt();
dayArray[temp-1][j]++;
}
}
StringBuilder result = new StringBuilder();
for (int i = 0; i < dayNum-1; i++) {
short count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[i][j] != 0) {
count++;
}
}
result.append(count).append(" ");
}
short count = 0;
for (int j = 0; j < pageNum; j++) {
if (dayArray[dayNum-1][j] != 0) {
count++;
}
}
result.append(count);
System.out.println(result);
scanner.close();
}
}