【JAVA】PAT 乙级 1058 选择题(测试点3解决错误解决方法)
之前写了个代码,但是测试点三没通过:【JAVA】PAT 乙级 1058 选择题(测试点3未通过)
最近又看了看,修改了一下终于过了,不过不太明白为什么。
修改代码如下
int check(int sgs, int[] sans) {
//加上注释部分通过不了
//if (sgs != zqgs) {
// cw++;
// return 0;
//}
for (int i = 0; i < gs/*把循环次数从5改成选项个数减少循环次数*/; i++) {
if ((ans[i] ^ sans[i]) == 1) {
cw++;
return 0;
}
}
return fs;
}
删掉部分是判断学生的选的选项个数是不是与正确答案的个数相同,如果不相同,直接返回0分,就不用继续后面的循环了,节省时间。我觉得逻辑没有错,但是加上这个确实最后一个样例过不了。。。。。。
另外一个修改的地方是把循环次数从5次改成了选项的个数,这样能减少循环的次数。
最后这道题目时间还是卡得比较紧,如果不能通过,记得多提交几次
题目时间限制300ms代码298ms通过
完整AC代码
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
StreamTokenizer in = new StreamTokenizer(bf);
in.wordChars('(', '(');
in.wordChars(')', ')');
in.nextToken();
int N = (int) in.nval;
in.nextToken();
int M = (int) in.nval;
tm[] t = new tm[M];
for (int i = 0; i < M; i++) {
in.nextToken();
int fs = (int) in.nval;
in.nextToken();
int gs = (int) in.nval;
in.nextToken();
int zqgs = (int) in.nval;
int[] ans = new int[5];
for (int j = 0; j < zqgs; j++) {
in.nextToken();
ans[in.sval.charAt(0) - 'a'] = 1;
}
t[i] = new tm(i + 1, fs, gs, zqgs, ans);
}
for (int i = 0; i < N; i++) {
int fs = 0;
for (int j = 0; j < M; j++) {
in.nextToken();
int sgs = in.sval.charAt(1) - '0';
int[] sans = new int[5];
for (int k = 0; k < sgs; k++) {
in.nextToken();
sans[in.sval.charAt(0) - 'a'] = 1;
}
fs += t[j].check(sgs, sans);
}
out.println(fs);
}
Arrays.sort(t);
if (t[0].cw == 0) {
out.print("Too simple");
} else {
out.print(t[0].cw + " " + t[0].bh);
for (int i = 1; i < t.length; i++) {
if (t[i].cw == t[i-1].cw) {
out.print(" " + t[i].bh);
}else {
break;
}
}
}
out.flush();
}
static class tm implements Comparable<tm> {
int bh;
int fs;
int gs;
int zqgs;
int[] ans;
int cw = 0;
tm(int b, int f, int g, int zq, int[] a) {
bh = b;
fs = f;
gs = g;
zqgs = zq;
ans = a;
}
int check(int sgs, int[] sans) {
for (int i = 0; i < gs; i++) {
if ((ans[i] ^ sans[i]) == 1) {
cw++;
return 0;
}
}
return fs;
}
@Override
public int compareTo(tm o) {
if (o.cw == this.cw) {
return this.bh - o.bh;
}
return o.cw - this.cw;
}
}
static int sti(String a) {
return Integer.parseInt(a);
}
static int[] stii(String a) {
String[] ra = a.split(" ");
int[] r = new int[ra.length];
for (int i = 0; i < r.length; i++) {
r[i] = sti(ra[i]);
}
return r;
}
}