这是PAT乙级考试题库B1058题的思路:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct question{
int wnum; //wnum用来记录该道题目错误的次数;
int mark; //mark用来记录该道题目的分值;ans字符数组记录正确答案
char ans[10];
}qus[110];
int sum[1010]={0};
int main(){
int n,m,temp1,temp2,temp3;
scanf("%d %d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d %d %d",&qus[i].mark,&temp1,&temp2);
getchar();
for(int j=0;j<temp2;j++){
scanf("%c",&qus[i].ans[j]); //需要通过输入记录的值即正确答案;由于题中输入格式的限制,只能用%c字符一个一个输入;
getchar(); //在字符串数组结尾要记得加上'\0'作为结束标志;
}
qus[i].ans[temp2]='\0';
qus[i].wnum=0;
}
for(int i=0;i<n;i++){
for(int j=1;j<=m;j++){
scanf("(%d",&temp3);char temp[10]; //输入学生的答题情况,要注意输入的格式的正确性;
for(int k=0;k<temp3;k++){
getchar();
scanf("%c",&temp[k]);
}
temp[temp3]='\0';
getchar();getchar(); //用getchar处理输入中不必要的字符;
if(strcmp(qus[j].ans,temp)==0){ //如果该题答案正确,则加分;
sum[i]+=qus[j].mark; //如果不正确。则该题的wnum自增;
}
else qus[j].wnum++;
}
printf("%d\n",sum[i]); //在每行输出每个人的得分;
}
int max=0;
for(int j=1;j<=m;j++){
if(qus[j].wnum>max){
max=qus[j].wnum; //求出错误数最高的错误数max
}
}
if(max==0) printf("Too simple");
else{
printf("%d",max);
for(int j=1;j<=m;j++){
if(qus[j].wnum==max) //再循环一遍,输出所有错误数为max的题的题号;
printf(" %d",j);
}
}
return 0;
}