1073 多选题常见计分法 (20 分)

【我的代码】

// 1073 多选题常见计分法 (20 分)
#include <iostream>
#include <string.h>
using namespace std;
struct Timu{
    double mark;
    int nc;
    int ny;
    int ncount[5] = {0};        //用于记录每个选项错误次数
    int pd[5] = { 0 };
}s[101]; 
double judge(int a[5], int b[5], int k){
    int count = 0;
    int yn = 0; //0为答对,1为答错
    for(int i = 0; i < s[k].nc; i++){
        if(b[i] && a[i]){   //如果输入为正确,正确计数器++ 
            count++;
        }
        else if (a[i] && !b[i]) {      //没有输入的正确选项
            s[k].ncount[i]++;
        }
        else if (!a[i] && b[i]) {      //输入了一个错误的选项
            s[k].ncount[i]++;
            yn = 1;
        }
    }
    if(yn) return 0;
    else if(count != s[k].ny) return s[k].mark/2;
    else if(count == s[k].ny) return s[k].mark; 
}
int main(){
    int N, M;//学生人数和多选题个数
    cin>>N>>M;
    double sum;
    char ch;
    int t[5];        //用t记录输入的选项
    //遍历题目 
    for(int i = 0; i < M; i++){
        cin>>s[i].mark>>s[i].nc>>s[i].ny;
        for(int j = 0; j < s[i].ny;j++){
            cin>>ch;
            s[i].pd[ch - 'a'] = 1; 
        }   
    } 
    //遍历学生
    int k;
    for(int i = 0;i < N; i++){
        sum = 0;
        for(int j = 0; j < M; j++){
            cin>>ch>>k;
            memset(t, 0, sizeof(t)); //重置为0
            for(int z = 0; z < k; z++){
                cin>>ch;
                t[ch - 'a']++;
            }
            //判断得分与比对答案
            sum += judge(s[j].pd, t, j); 
            cin>>ch;
        }
        printf("%0.1lf
", sum);
    } 
    int max = 0;
    for(int i = 0; i < M; i++){
        for(int j = 0;j < s[i].nc; j++){
            max = s[i].ncount[j] > max ? s[i].ncount[j] : max;
        }
    }
    if(max){
        for(int i = 0; i < M; i++){
            for(int j = 0; j < s[i].nc; j++){
                if(s[i].ncount[j] == max){
                    cout<<max<<" "<<i+1<<"-"<<(char) (j+'a')<<endl;
                }
            }
        }
    }
    else{
        cout<<"Too simple";
    }
    return 0;
} 

【总结】

这题目跟前面有一题很类似,同样需要建立题目的结构体。

收藏 打印