1073 多选题常见计分法

这是我目前为止做过的最麻烦的一道题!!!真不想再碰这道题了!,关于选项的字符串处理相当麻烦!!!

坑点:错误包括 错选  漏选。

ps:比 B1058 选择题 麻烦一些。

#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;
}

 

//麻烦点:关于正确选项的字符串处理
posted @ 2020-02-24 21:58  tangq123  阅读(210)  评论(0编辑  收藏  举报