PTA 乙级 1058 选择题 (20分) C++
题目输入和输出比较繁琐,说一下思路
思路:
- 建立一个题目信息的结构体,包含题目满分,选项个数,正确选项个数。正确选项字母,之后分别输入(所有题目信息统计完成)
- 两层循环,第一层是学生数,第二层是题目数,题中有具体学生选项输入格式(选中的选项个数,选项1...)且每个题用空格隔开,利用一个特定的输入格式即可实现输入
1 int r = 0; //学生选中选项个数 2 char w[5] = { '\0' }, c; //注意在topic的结构体中,char word[5]默认初始化为'\0',保持空位一致 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] = { '\0' }, c; //注意在topic的结构体中,char word[5]默认初始化为'\0',保持空位一致 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 }
默默地一点点变强,细节决定成败