1058 选择题 (20 分)
【代码】
1// 1058 选择题 (20 分).cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
2//
3
4#include<stdio.h>
5#include<string.h>
6#include<algorithm>
7using namespace std;
8struct ti {
9 int tihao;
10 int fen;
11 int xuan;
12 int Tnum;
13 bool zhengquedaan[127] = { 0 };//用整数形式保存正确选项
14 int cuo = 0;
15}Data[101];
16//根据错题数量排序
17bool cmp(ti A, ti B) {
18 if (A.cuo != B.cuo) return A.cuo > B.cuo;
19 else return A.tihao < B.tihao;
20}
21int main() {
22 int N, M;//学生,题
23 scanf("%d %d", &N, &M);
24 for (int i = 0; i < M; i++) {//题数
25 scanf("%d", &Data[i].fen);
26 scanf("%d", &Data[i].xuan);
27 scanf("%d", &Data[i].Tnum);
28 for (int j = 0; j < Data[i].Tnum; j++) {
29 char c;
30 scanf(" %c", &c);
31 int a = c;
32 Data[i].zhengquedaan[a] = true;
33 }
34 Data[i].tihao = i + 1;
35 }
36 //输入学生
37 for (int i = 0; i < N; i++) {
38 int fenshu = 0;
39 //输入处理选项
40 for (int k = 0; k < M; k++) {
41 int num; char c;
42 int zhengnum = 0;
43 int flag = true;
44 scanf(" (%d", &num);
45 for (int j = 0; j < num; j++) { //验证答案
46 scanf(" %c", &c);
47 if (Data[k].zhengquedaan[c]) zhengnum++;
48 else flag = false;
49 }
50 //吸收括号
51 getchar();
52 if (zhengnum == Data[k].Tnum && flag) fenshu += Data[k].fen;
53 else Data[k].cuo++;
54 }
55 printf("%d\n", fenshu);
56 }
57 //根据错误情况排序
58 sort(Data, Data + M, cmp);
59 if (Data[0].cuo == 0) {
60 printf("Too simple");
61 return 0;
62 }
63 printf("%d", Data[0].cuo);
64 for (int i = 0; i < M; i++) {
65 if (Data[i].cuo != Data[0].cuo) break;
66 printf(" %d", Data[i].tihao);
67 }
68 return 0;
69}
【思路】
这道题比较复杂,难点就是很容易绕晕。