【JAVA】PAT 乙级 1058 选择题(测试点3解决错误解决方法)

【JAVA】PAT 乙级 1058 选择题(测试点3解决错误解决方法)

  • 完整AC代码

之前写了个代码,但是测试点三没通过:【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次改成了选项的个数,这样能减少循环的次数。
最后这道题目时间还是卡得比较紧,如果不能通过,记得多提交几次
【JAVA】PAT 乙级 1058 选择题(测试点3解决错误解决方法)_第1张图片
题目时间限制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;
	}
}

你可能感兴趣的:(【JAVA】PAT,乙级)