//PAT-1-1073
#include <iostream>
#include <algorithm>
#include <string>
#include <math.h>
#include <sstream>
#include <vector>
using namespace std;
typedef struct {
int grade;
int num;
int correct;
char corr[5];
}info;
typedef struct{
int errnum;
int mark;
char choice;
}fault;
int comp(const fault a,const fault b){
// fault* a= (fault*)aa;
// fault* b= (fault*)bb;
if (a.errnum!=b.errnum) {
return a.errnum>b.errnum;
}
else if(a.mark!=b.mark){
return a.mark<b.mark;
}else return a.choice<b.choice;
}
int main(){
int n,m;
cin>>n>>m;
int count[m];
double score[n];
int max=0;
for (int i=0; i<m; i++) {
count[i]=0;
}
for (int i=0; i<n; i++) {
score[i]=0;
}
info answer[m];
vector<fault> res;
for (int i=0; i<m; i++) {
cin>>answer[i].grade>>answer[i].num>>answer[i].correct;
for (int j=0; j<answer[i].correct; j++) {
cin>>answer[i].corr[j];
}
}
for (int i=0; i<n;i++) {
for (int j=0; j<m; j++) {
int a_n=0;
scanf("\n");//消去这个回车很关键
if (j==0) {
scanf("(%d",&a_n);
}
else {
scanf(" (%d",&a_n);
}
char a[a_n];
for (int k=0; k<a_n; k++) {
scanf(" %c",&a[k]);//%c前面的空格很关键
}
scanf(")");
int flag=1;
int flag2=1;
//两次遍历 找出所有输入的选项和正确选项的对称差,即出错的选项
for (int r1=0; r1<a_n; r1++) {
int f2=0;
for (int r2=0; r2<answer[j].correct; r2++) {
if (a[r1]==answer[j].corr[r2]) {
f2=1;
break;
}
}
if (f2==0) {
flag=0;
flag2=0;
fault tem;
tem.mark=j+1;
tem.choice=a[r1];
res.push_back(tem);
}
}
for (int r1=0; r1<answer[j].correct; r1++) {
int f2=0;
for (int r2=0; r2<a_n; r2++) {
if (answer[j].corr[r1]==a[r2]) {
f2=1;
break;
}
}
if (f2==0) {
flag=0;
fault tem;
tem.mark=j+1;
tem.choice=answer[j].corr[r1];
res.push_back(tem);
}
}
if (flag==0&&flag2==0) {
continue;
}else if(flag==0&&flag2==1) {//flag=0说明没做全对 flag2=1说明选的选项都是正确的,按要求给一般分
score[i]+=0.5*answer[j].grade;
}else if(flag==1){
score[i]+=answer[j].grade;
}
}
}
for (int i=0; i<n; i++) {
printf("%.1lf\n",score[i]);
}
if (res.size()==0) {
cout<<"Too simple"<<endl;
return 0;
}
vector<fault> final;
//收集出错选项 并统计出错次数
for (int i=0; i<res.size(); i++) {
int f3=0;
for (int j=0; j<final.size(); j++) {
if (res[i].choice==final[j].choice&&res[i].mark==final[j].mark) {
final[j].errnum+=1;
f3=1;
break;
}
}
if (f3==0) {
res[i].errnum=1;
final.push_back(res[i]);
}
}
//按要求输出
sort(final.begin(), final.end(), comp);
cout<<final[0].errnum<<" "<<final[0].mark<<"-"<<final[0].choice<<endl;
for (int i=1; i<final.size(); i++) {
if (final[i].errnum==final[i-1].errnum) {
cout<<final[i].errnum<<" "<<final[i].mark<<"-"<<final[i].choice<<endl;
}
else break;
}
return 0;
}
1073. 多选题常见计分法(20)
最新推荐文章于 2024-04-30 06:51:20 发布