题目链接:
https://pintia.cn/problem-sets/994805260223102976/problems/994805263624683520
AC代码(借鉴巨佬的:https://blog.csdn.net/xpursue/article/details/78721037):
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct choo//题目选项信息
{
int full;//满分
int chnum;//该题选项个数
int an;//该题答案个数
string ch;//正确答案组成的字符串
};
int main()
{
int n,m,i,j,x,k,f,wr=0;
char co;
float s;
cin>>n>>m;
int wrong[m][5]={0};
choo choo[m];
for(i=0;i<m;i++)//遍历选项
{
cin>>choo[i].full>>choo[i].chnum>>choo[i].an;
for(j=0;j<choo[i].an;j++)
cin>>co,choo[i].ch+=co;
}
while(n--)//遍历学生
{
s=0;//每个学生的成绩
for(i=0;i<m;i++)
{
scanf(" ");//便于(的输入
string ans;
scanf("(%d",&x);
for(j=0;j<x;j++)
scanf(" %c",&co),ans+=co;//必须加空格
scanf(")");
if(ans==choo[i].ch)s+=choo[i].full;//答案全部正确
else
{
f=0;
for(k=0;k<ans.length();k++)//错题
{
choo[i].ch.find(ans[k]);
if(choo[i].ch.find(ans[k])==-1)
//在学生选项中出现,不在正确答案中出现
{
wrong[i][ans[k]-'a']++;
//在每个学生下,统计每道题的错误次数
//最后输出错得最多的题目选项的信息
f=1;
if(wrong[i][ans[k]-'a']>wr)wr=wrong[i][ans[k]-'a'];//记录最大错误次数
}
}
for(k=0;k<choo[i].ch.length();k++)//漏题
{
if(ans.find(choo[i].ch[k])==-1)
//在正确答案中出现,不在学生选项中出现
{
wrong[i][choo[i].ch[k]-'a']++;
//在每个学生下,统计每道题的错误次数
//最后输出错得最多的题目选项的信息
if(wrong[i][choo[i].ch[k]-'a']>wr)wr=wrong[i][choo[i].ch[k]-'a'];
//记录最大错误次数
}
}
if(f==0)s+=choo[i].full/2.0;
}
}
printf("%.1f\n",s);
}
if(wr==0){cout<<"Too simple";return 0;}
for(i=0;i<m;i++)//多选题的个数
{
for(j=0;j<5;j++)//每个多选题最多5个选项
{
if(wr==wrong[i][j])//错误次数最多的选项可能不止一个
printf("%d %d-%c\n",wr,i+1,'a'+j);
//错误次数,题目编号,选项号
}
}
return 0;
}