PAT乙级1073 多选题常见计分法 (20 分)(这道题太恶心了,恶心啊)

https://pintia.cn/problem-sets/994805260223102976/problems/994805263624683520

全是坑 题干太长了

#include 
#include 
using namespace std;
struct test {
	double maxscore = 0.0, halfscore = 0.0;
	int answer = 0, cnt_choice = 0, correct = 0, cnt = 0, err[300] = { 0 };
};
int main() {
	map match;
	match['a'] = 1; match['b'] = 2; match['c'] = 4; match['d'] = 8; match['e'] = 16;
	int N, M, a = 1, b = 2, c = 4, d = 8, e = 16;
	cin >> N >> M;
	test exam[105];
	for (int i = 0; i < M; i++) {
		char c;
		cin >> exam[i].maxscore >> exam[i].cnt_choice >> exam[i].correct;
		for (int j = 0; j < exam[i].correct; j++) {
			cin >> c;
			exam[i].answer += match[c];
		}
		exam[i].halfscore = exam[i].maxscore / 2;
	}
	for (int i = 0; i < N; i++) {
		double s = 0.0;
		for (int j = 0; j < M; j++) {
			int tmp, tmpans = 0, flag = 0;
			char c;
			c = getchar();
			while (c != '(')
				c = getchar();
			cin >> tmp;
			for(int k = 0; k < tmp; k++){
				cin >> c;
				tmpans += match[c];
			}
			int num = tmpans ^ exam[j].answer;
			if(num){
				exam[j].cnt++;
				if((num & exam[j].answer) == num)
					s += exam[j].halfscore;
				for(int k = 0; k < 5; k++){
					char ccc = k + 'a';
					int cc = num & match[ccc];
					if(cc == match[ccc])
						exam[j].err[k+'a']++;
				}
			}else
				s += exam[j].maxscore;
		}
		printf("%.1f\n", s);
	}
	int max = 0;
	for(int i = 0; i < M; i++){
		for(int j = 0; j < 5; j++){
			if(exam[i].err['a'+j] > max)
				max = exam[i].err['a'+j];
		}
	}
	if(!max)	cout << "Too simple";
	else{
		for(int i = 0; i < M; i++){
			for(int j = 0; j < 5; j++){
				if(max == exam[i].err['a'+j])
					printf("%d %d-%c\n", max, i+1, 'a'+j);
			}
		}
	}
	return 0;
}

你可能感兴趣的:(PAT刷题之旅)