1073 多选题常见计分法
作者:互联网
这是我目前为止做过的最麻烦的一道题!!!真不想再碰这道题了!,字符串处理相当麻烦!!!
坑点:错误包括 错选 和 漏选。
#include<iostream> #include<algorithm> using namespace std; int score[200] = {0};//存放题目分值 int wrong[200][5];//每道题的每个选项,错选或者漏选的次数统计 struct Option { int rtNum;//存放正确选项个数 string rtOption;//存放题目正确选项 } option[200]; int main() { int n,m,num,MAX = -1; char c; cin>>n>>m; for(int i = 0; i < m; ++i) { scanf("%d%d%d",&score[i],&num,&option[i].rtNum); for(int j = 0; j < option[i].rtNum; ++j) { scanf(" %c",&c); option[i].rtOption += c; } } for(int i = 0; i < n; ++i) {// n个学生 double grade = 0; for(int j = 0; j < m; ++j) {//m个题目 while(getchar() != '(');//跳过所有非 '('字符 scanf("%d",&num); string opt; for(int k = 0; k < num; ++k) { scanf(" %c",&c); opt += c; } bool flag = false;//是否存在错误选项 for(int k = 0; k < num; ++k) {//统计第 j 题的第 k选项错选次数 if(option[j].rtOption.find(opt[k]) == -1) { flag = true;//存在错误选项 wrong[j][opt[k]-'a']++; MAX = max(MAX,wrong[j][opt[k]-'a']); } } for(int k = 0; k < option[j].rtNum; ++k) {//统计第 j 题的第 k选项漏选次数 if(opt.find(option[j].rtOption[k]) == -1) { wrong[j][option[j].rtOption[k]-'a']++; MAX = max(MAX,wrong[j][option[j].rtOption[k]-'a']); } } if(flag == false && num == option[j].rtNum)//全选对,得全分 grade += score[j]; else if(flag == false && num < option[j].rtNum)//部分选对,得一半的分 grade += score[j]/2.0; } printf("%.1f\n",grade); } if(MAX == -1) printf("Too simple"); else for(int i = 0; i < m; ++i) { for(int j = 0 ; j < 5; ++j) { if(wrong[i][j] == MAX) { printf("%d %d-%c\n",MAX,i+1,j+'a'); } } } return 0; }
标签:option,计分,int,MAX,1073,多选题,rtNum,++,num 来源: https://www.cnblogs.com/keep23456/p/12359100.html