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

“人其实就这一辈子,我想要的生活不是安逸的,虽然很累,但我想要辉煌的人生,所以也一直在为此努力、不松懈。我所理解的辉煌人生,不是挣了多少钱、做了多伟大的事,而是将人生过得有意义,不碌碌无为。哪怕前进得很慢,但是每分每秒都在往前走,去追求梦想。”                                                                                                                          ----喻言

批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到 50% 分数;如果考生选择了任何一个错误的选项,则不能得分。本题就请你写个程序帮助老师批改多选题,并且指出哪道题的哪个选项错的人最多。

输入格式:

输入在第一行给出两个正整数 N(≤1000)和 M(≤100),分别是学生人数和多选题的个数。随后 M 行,每行顺次给出一道题的满分值(不超过 5 的正整数)、选项个数(不少于 2 且不超过 5 的正整数)、正确选项个数(不超过选项个数的正整数)、所有正确选项。注意每题的选项从小写英文字母 a 开始顺次排列。各项间以 1 个空格分隔。最后 N 行,每行给出一个学生的答题情况,其每题答案格式为 (选中的选项个数 选项1 ……),按题目顺序给出。注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。

输出格式:

按照输入的顺序给出每个学生的得分,每个分数占一行,输出小数点后 1 位。最后输出错得最多的题目选项的信息,格式为:错误次数 题目编号(题目按照输入的顺序从1开始编号)-选项号。如果有并列,则每行一个选项,按题目编号递增顺序输出;再并列则按选项号递增顺序输出。行首尾不得有多余空格。如果所有题目都没有人错,则在最后一行输出 Too simple

输入样例 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)

输出样例 1:

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

输入样例 2:

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

输出样例 2:

5.0
5.0
Too simple
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <vector>
#include <ctime>
#include <cctype>
#include <bitset>
#include <utility>
#include <sstream>
#include <complex>
#include <iomanip>
#include <numeric>
#include<unordered_set>
#include <climits>//INT_100010n
//#include<bits/stdc++.h>
#define PP pair<ll,int>
#define inf 0x3f3f3f3f
#define INF 0x7fffffff;
#define llinf 0x3f3f3f3f3f3f3f3fll
#define dinf 1000000000000.0
#define PI 3.1415926
#define LL unsigned int
#define mod 1000000007
#define wc 1e-18
typedef long long ll;
using namespace std;
struct node
{
    double score;
    int jgct;
    int acct;
    int a[110]= {0};
    char jg[1000];
}P[1100];
int n,m,a[1100][110];
double socre[1100];
int main()
{
    cin>>n>>m;
    for(int i=0; i<m; i++)
    {
        cin>>P[i].score;
        cin>>P[i].jgct;
        cin>>P[i].acct;
        for(int j=0; j<P[i].acct; j++)
        {
            cin>>P[i].jg[j];
            P[i].a[P[i].jg[j]]=1;
        }
    }
    for(int i=0; i<n; i++)
    {
        char tmp;
        double fs=0;
        for(int k=0; k<m; k++)
        {
            cin>>tmp;
            int fg[110],fg1=0,id=0,z;
            memset(fg,0,sizeof(fg));
            cin>>z;
            for(int j=0; j<z; j++)
            {
                cin>>tmp;
                if(P[k].a[tmp]==0)
                {
                    a[k][tmp]++;
                    fg1=1;
                }
                fg[tmp]=1;
            }
            if(fg1==0)
            {
                if(z==P[k].acct)
                    fs+=P[k].score;
                else
                    fs+=P[k].score*1.0/2;
            }
            for(int k1=0; k1<P[k].acct; k1++)
            {
                int id=P[k].jg[k1];
                if(fg[id]==0)
                    a[k][id]++;
            }
            getchar();
            getchar();
        }
        socre[i]+=fs;
    }
    for(int i=0; i<n; i++)
        printf("%0.1f\n",socre[i]);
    int mx=-9999;
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<=108; j++)
        {
            if(a[i][j]>=mx)
                mx=a[i][j];
        }
    }
    if(mx==0)
    {
        cout<<"Too simple"<<endl;
        return 0;
    }
    for(int i=0; i<m; i++)
    {
        for(int j=0; j<=108; j++)
        {
            if(a[i][j]==mx)
                cout<<mx<<" "<<i+1<<"-"<<char(j)<<endl;
        }
    }
    return 0;
}

 

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页