PTA 乙级 1058 选择题 (20分) C++

 题目输入和输出比较繁琐,说一下思路

思路:

  • 建立一个题目信息的结构体,包含题目满分,选项个数,正确选项个数。正确选项字母,之后分别输入(所有题目信息统计完成)
  • 两层循环,第一层是学生数,第二层是题目数,题中有具体学生选项输入格式(选中的选项个数,选项1...)且每个题用空格隔开,利用一个特定的输入格式即可实现输入      
    1 int r = 0;                                    //学生选中选项个数
    2 char w[5] = { '' }, c;                    //注意在topic的结构体中,char word[5]默认初始化为'',保持空位一致
    3 while ((c = getchar()) != ')') {            //在1052卖个萌中用到过这种输入方法,实现按规定格式的输入
    4     if (c == '(') {
    5         cin >> r;
    6         for (int k = 0; k < r; ++k)cin >> w[k];
    7     }
    8 }
  • 利用<cstring>中的strcmp实现学生选项和正确选项的比较,正确即学生所得分数增加,错误即本题错误数增加
  • 遍历每个题的错误次数,找到最高错误数

  • 输出每个学生的得分后,若最高错误数为0,则输出“Too simple”,否则,输出最高错误数,和与最高错误数错误数相同的编号(注意编号是从1算起的,需要在数组角标基础上再加1)
 1 #include<iostream>
 2 #include<vector>
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 struct text {
 8     /*满分*/
 9     int full;
10     /*选项个数*/
11     int num;
12     /*正确选项个数*/
13     int right;
14     /*正确选项字母*/
15     char word[5];
16 };
17 
18 int main() {
19     /*N,M*/
20     int n = 0, m = 0;
21     cin >> n >> m;
22     /*题目*/
23     vector<text> topic(m);
24     /*学生得分*/
25     vector<int> stur(n);
26     /*每个题错的次数*/
27     vector<int> wrong(m);
28     //有关题目信息的输入
29     for (int i = 0; i < m; ++i) {
30         cin >> topic[i].full >> topic[i].num >> topic[i].right;
31         for (int j = 0; j < topic[i].right; ++j)cin >> topic[i].word[j];
32     }
33     for (int i = 0; i < n; ++i) {
34         for (int j = 0; j < m; ++j) {
35             int r = 0;                                    //学生选中选项个数
36             char w[5] = { '' }, c;                    //注意在topic的结构体中,char word[5]默认初始化为'',保持空位一致
37             while ((c = getchar()) != ')') {            //在1052卖个萌中用到过这种输入方法,实现按规定格式的输入
38                 if (c == '(') {
39                     cin >> r;
40                     for (int k = 0; k < r; ++k)cin >> w[k];
41                 }
42             }
43             if (r == topic[j].right && strcmp(topic[j].word, w) == 0) stur[i] += topic[j].full;    //正确
44             else wrong[j]++;                                                                    //错误,即题错误次数增加
45         }
46     }
47     int max = wrong[0];
48     for (int i = 0; i < m; ++i) if (max < wrong[i]) max = wrong[i];        //统计最高错误次数
49     for (int i = 0; i < n; ++i)cout << stur[i] << endl;
50     if (max != 0) {
51         cout << max;
52         for (int i = 0; i < m; ++i) if (wrong[i] == max) cout << ' ' << i + 1;    //输出和最高错误次数相同的题目编号
53     }
54     else cout << "Too simple";
55     return 0;
56 }

默默地一点点变强,细节决定成败
原文地址:https://www.cnblogs.com/SCP-514/p/13567760.html