PAT B -1073 méthode multiple de notation de choix commun (20 minutes)

Cliquez sur le lien résumé complet de solution PAT B -AC

Titre:
marquage choix multiple est chose plus difficile, il y a beaucoup de différents système de notation. L' un des points les plus communs est la suivante : si les candidats sélectionnés l' option partiellement correcte et ne sélectionnez aucune option d'erreurs, vous obtenez un score de 50%, si l'un des candidats a choisi la mauvaise option, vous ne pouvez pas marquer. Cette question vous demandera d'écrire un programme pour aider les enseignants marquer des questions à choix multiples, et indiquer l'option que la plupart des questions des mauvaises personnes.

Format d' entrée:
Apportera deux entiers positifs N (≤1000) et M (≤100) dans la première rangée, le nombre d'étudiants et sont le nombre de questions à choix multiples. rangées par la suite M, chaque rangée est la valeur donnée de manière séquentielle sur une question (un nombre entier positif non supérieur à 5), le nombre d'options (un entier positif non inférieur à 2 et pas plus de 5), le nombre correct d'options (option dépasse pas une entier positif), toutes les bonnes options. Notez que les options pour chaque question des lettres minuscules commencent un arrangement séquentiel. Parmi tous séparés par un espace. Les dernières lignes N, chaque élève reçoit un cas de réponse, chaque question format réponse (选中的选项个数 选项1 ……), le titre donné dans l'ordre. Note: Titre que les élèves répondent le cas est légitime, le nombre d'options qui n'existe pas que le nombre réel d'options.

Format de sortie:
donné un score de chaque élève dans l'ordre d'entrée, un bit après chaque ligne de partition, la sortie du point décimal. mal de sortie finale la plupart des options d' information de sujet, dans le format suivant : 错误次数 题目编号(题目按照输入的顺序从1开始编号)-选项号. Si côte à côte, chaque rangée est une option, en fonction de la sortie de document dans l' ordre numérique croissant, puis appuyez sur le numéro de sortie Option-parallèle dans l' ordre croissant. Ligne du début à la fin ne peut pas avoir l'espace supplémentaire. Si tous les sujets ne va pas, la sortie dans la dernière ligne Too simple.

Entrée Echantillon 1:

3 4 
3 4 2 a c
2 5 1 b
5 3 2 b c
1 5 4 a b d e
(2 a c) (3 b d e) (2 a c) (3 a b e)
(2 a c) (1 b) (2 a b) (4 a b d e)
(2 b d) (1 e) (1 c) (4 a b c d)

Exemple de sortie 1:

3.5
6.0
2.5
2 2-e
2 3-a
2 3-b

Entrée échantillon 2:

2 2 
3 4 2 a c
2 5 1 b
(2 a c) (1 b)
(2 a c) (1 b)

Exemple 2 de sortie:

5.0
5.0
Too simple

Mon code:

#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<sstream>
using namespace std;
//有的时候题目是一起做的,所以会有不需要的头文件

int main()
{
    int N, M;
    cin >> N >> M;

    //0:score 1-5:abcde 6:num_true
    int score_key[M][8];
    memset(score_key, 0, sizeof(score_key));

    //遍历答案
    for (int i = 0; i < M; i++)
    {
        cin >> score_key[i][0];
        int options, num_true;
        cin >> options >> num_true;
        score_key[i][6] = num_true;
        for (int j = 0; j < num_true; j++)
        {
            char t;
            cin >> t;
            score_key[i][t - 'a' + 1] = 1;
        }
    }
    getchar();

    //选项错误次数
    int wrong_times[M][6] = { 0 };
    //遍历学生
    for (int i = 0; i < N; i++)//第i个学生
    {
        double score_stu=0; //学生得分
        string student; //学生答案
        getline(cin, student);
        for (int j = 0; j < M; j++)//第j道题
        {
            student.erase(0, student.find('(') + 1);

            //记录这道题学生的答案
            int stu_answer[6]={0};
            for (int k = 0; k < student[0] - '0'; k++)
            {
                student.erase(0, student.find(' ') + 1);
                stu_answer[student[0]-'a'+1]=1;
            }

            //对比正确答案并记录错误选项
            int flag_score=10;//少选了就-1,多选了就=0
            for(int k=1;k<=5;k++)
            {
                //abcde五个选项
                if(score_key[j][k]&&!stu_answer[k])//少选
                {
                    flag_score--;
                    wrong_times[j][k]++;
                }
                else if(!score_key[j][k]&&stu_answer[k])//多选
                {
                    flag_score=0;
                    wrong_times[j][k]++;
                }
            }

            //计算这道题得分
            if(flag_score==10) score_stu+=score_key[j][0];
            else if(flag_score>0) score_stu+=1.0*score_key[j][0]/2;

        }
        printf("%.1f\n",score_stu);
    }

    //遍历错误答案,找错误次数最多的答案
    int max_times=0;
    for (int i = 0; i < M; i++)
    {
        for (int j = 1; j <= 5; j++)
        {
            if(max_times<wrong_times[i][j])
               max_times=wrong_times[i][j];
        }
    }

    //输出错误次数最多的答案
    if(max_times==0)
        cout<<"Too simple"<<endl;
    else
    {
        for (int i = 0; i < M; i++)
        {
            for (int j = 1; j <= 5; j++)
            {
                if(max_times==wrong_times[i][j])
                   printf("%d %d-%c\n",max_times,i+1,'a'+j-1);
            }
        }
    }

    return 0;
}

Cette question est un peu ennuyeux, mais pas trop difficile, chaque note de nom variable écrit en détail ~

Publié 82 articles originaux · a gagné les éloges 1 · views 1662

Je suppose que tu aimes

Origine blog.csdn.net/qq_34451909/article/details/104939134
conseillé
Classement