思路:本题其实思路还是比较直的,只是写的时候可能会有点复杂。首先将题看成一个整体确立一个结构体数组,每个结构体里面存放了题目编号(其实也可以不要),该题分数,选项数,正确数,错误数,和正确选项(用一个字符数组表示)。
这些东西处理完之后,然后需要一个新的数组来存放学生的成绩。最后就是用快排对结构体数组排序(注意定义排序规则)
代码如下:
using namespace std;
struct node
{
int N;//题目编号
int score;//分数
int num;//选项数
int oknum;//正确选项数
int wrongtime;//错误次数
char choice[5];//正确选项
}p[105];
char str[10005];
int cmp(node a, node b)
{
return (a.wrongtime!=b.wrongtime)?a.wrongtime>b.wrongtime:a.N<b.N;
}
int main()
{
int grade[1005]={0};//记录每位学生的得分
int n,m,i,j,k,u,len,flag;
cin>>n>>m;
for(i=0;i<m;i++)//输入
{
cin>>p[i].score>>p[i].num>>p[i].oknum;
p[i].wrongtime=0;
p[i].N=i;
for(j=0;j<p[i].oknum;j++)
cin>>p[i].choice[j];
}
getchar();
for(i=0;i<n;i++)
{
cin.getline(str,10005);
len=strlen(str);
flag=k=u=0;
for(j=0;j<len;j++)
{
if(str[j] == '(' || str[j] == ' ')
continue;
if(str[j] == ')')
{
if(flag)//如果这道题有错误
p[k].wrongtime++;
else
grade[i] += p[k].score;//否则加分
flag = u = 0;
k++;
}
if(isdigit(str[j]))
{
if(str[j]-48 != p[k].oknum)
{
flag = 1;
}
}
if(isalpha(str[j])&&!flag)
{
if(str[j]==p[k].choice[u++])
continue;
flag = 1;
}
}
}
for(i = 0; i<n; i++)//输出每位学生的得分
cout << grade[i] << endl;
sort(p, p+m, cmp);
if(p[0].wrongtime == 0)
printf("Too simple");
else
{
printf("%d %d", p[0].wrongtime, p[0].N+1);
for(i = 1; i < m; i++)
{
if(p[i].wrongtime == p[0].wrongtime)
printf(" %d", p[i].N+1);
else
break;
}
}
}