思路
1、将答案转化为数字形式,比如a、b、e,数字表示为11001,方便对比和计算;
2、对于“指出哪道题的哪个选项错的人最多”这句话,可能换句话好理解一些:哪道题的哪个选项错误次数最多。建一个err[100][5]二维数组来记录,具体计算方式见下;
3、关于每个人得分的计算,使用选对个数(cnt)来辅助计算,对于回答的每一道题,遍历正确的答案和自己的回答,有以下几种情况:
①答案有,没选(correct[c][j]==1&&answer[c][j]==0):err[c][j]++表示选项错误次数+1;
②答案有,选了(correct[c][j]==1&&answer[c][j]==1):cnt++表示选对个数+1;
③答案没有,没选(correct[c][j]==0&&answer[c][j]==0):不做处理;
④答案没有,选了(correct[c][j]==0&&answer[c][j]==1):err[c][j]++表示选项错误次数+1,cnt=-10表示选对个数变为负数;
每个人的得分根据选对个数cnt与正确答案个数correct_cnt进行对比得出,详见代码;
5、最后遍历可得到错误最多的选项,注意Too simple的输出。
AC代码
#include<stdio.h>
#include<string.h>
int main(){
int n,m,err[100][5]={0},score[100]={0},correct_cnt[100]={0};
int correct[100][5]={0},ch,Max=0;
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %*d %d",&score[i],&correct_cnt[i]);
while((ch=getchar())!='\n'){
if(ch>='a'&&ch<='e')correct[i][ch-'a']=1;//correct将答案转为数字形式
}
}
for(int i=0;i<n;i++){
int answer[100][5]={0},c=0;//answer将回答转化为数字形式,c来匹配题目序号
float sum=0;//sum计算每人分数
while((ch=getchar())!='\n'){//每个人
if(ch=='('){//每人回答的每道题
int cnt=0;//cnt计算每道题的回答正确个数
while((ch=getchar())!=')'){//每道题的回答
if(ch>='a'&&ch<='e')answer[c][ch-'a']=1;
}
for(int j=0;j<5;j++){//匹配答案
if(correct[c][j]==0&&answer[c][j]==0)continue;
if(correct[c][j]==0&&answer[c][j]==1){err[c][j]++;cnt=-10;}//选错
if(correct[c][j]==1&&answer[c][j]==0)err[c][j]++;//没选
if(correct[c][j]==1&&answer[c][j]==1)cnt++;//选对
}
if(cnt>0&&cnt==correct_cnt[c])sum+=score[c];//全对,满分
if(cnt>0&&cnt!=correct_cnt[c])sum+=(float)score[c]/2;//漏选,得一半分
c++;//下一题
}
}
printf("%.1f\n",sum);
}
for(int i=0;i<m;i++){//找错误最多的选项
for(int j=0;j<5;j++)if(err[i][j]>Max)Max=err[i][j];
}
if(Max==0)printf("Too simple");//没错的情况
else{
for(int i=0;i<m;i++){
for(int j=0;j<5;j++){
if(err[i][j]==Max)printf("%d %d-%c\n",Max,i+1,'a'+j);
}
}
}
return 0;
}