PAT 乙级 1058 选择题

思路:先将每道题的各项信息存到定义的question结构体里,然后每输入一个人的做题信息,分别与结构体里的问题信息进行比较,计算出该学生的分数并修改结构体里的错误次数的值,最后通过定义好的cmp函数进行排序,就可以求出错误次数最多的题目和编号了。要注意输入每个同学的做题信息是的括号要吸收掉,所以代码看起来会很乱。
#include<bits/stdc++.h>
using namespace std;
struct Question{//定义问题结构体,包含本题的分数,选项个数,正确选项个数,错误次数,序号,一个用来存放正确选项的数组
int score;
int maxOption;
int rightOption;
int number;
int count = 0;
char chq[5];
}question[101];
bool cmp(Question a, Question b){ //定义一个排序的cmp函数,先按照错误次数比较,若错误次数相同则按照序号比较
if(a.count!=b.count){
return a.count>b.count;
}
else return a.number<b.number;
}
int main(){
int n, m;
cin>>n>>m;
for(int i = 0; i < m;i++){ //将每道题的各项信息存到结构体里
cin>>question[i].score>>question[i].maxOption>>question[i].rightOption;
question[i].number = i+1; //因为i从零开始,题目编号从一开始,因此要加一
for(int j = 0; j < question[i].rightOption; j++){
cin>>question[i].chq[j]; //存正确选项
}
}
for(int i = 0; i < n; i++){
int points = 0; //每输入一个人的做题信息,输出一个分数
for(int j = 0; j < m; j++){
char k; //从第一题开始遍历,k用来吸收左括号
cin>>k;
int chose,flag = 1; //输入该同学该题选的选项数,flag用来记录该题是否做对
cin>>chose;
if(chose!=question[j].rightOption) //该同学选的选项数不等于正确选项数,说明做错了
flag = 0;
for(int o = 0; o < chose;o++){ //输入该同学选的选项,依次与正确的选项比较,若不同,则做错,flag置为零
char l;
cin>>l;
if(l!=question[j].chq[o]){
flag = 0;
}
}
if(flag){ //如果做对了,该同学分数增加
points += question[j].score;
}
else question[j].count++; //如果做错了,该题目错误次数增加
char p; //吸收右括号
cin>>p;
}
cout<<points<<endl;
}
sort(question,question+m,cmp); //按照cmp函数排序后,question[0].count存放的是错误次数最多的题目,若为零,则说明没人做错
if(question[0].count == 0){
cout<<"Too simple";
}
else{
int cnt2 = 0; //输出错误次数最多的题目
cout<<question[cnt2].count<<" ";
while(question[cnt2].count==question[cnt2+1].count){
cout<<question[cnt2].number<<" ";
cnt2++;
}
cout<<question[cnt2].number;
}
}
本文主要介绍了PAT乙级编程竞赛中的一道题目,涉及结构体的使用和错误统计。通过输入学生答题信息,计算错误次数,排序找出错误最多的题目,并输出错误次数及对应题目编号。代码实现包括问题结构体定义、错误次数比较函数以及遍历学生答题信息的过程。

8566

被折叠的 条评论
为什么被折叠?



