您的位置:首页 > 其它

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

2017-09-24 17:52 302 查看
批改多选题是比较麻烦的事情,有很多不同的计分方法。有一种最常见的计分方法是:如果考生选择了部分正确选项,并且没有选择任何错误选项,则得到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>
using namespace std;

struct problem{   //存放题目
double score;   //总分
int sum;    //选项总数
int anw;    //正确选项总数
string right;    //正确选项集合
};
problem p[105];
int wrong[101][5]={0};
int main()
{
int N, M;
cin >> N >> M;  //学生人数,题目数
int max = -1;
for(int i = 0; i < M; i ++){
cin>>p[i].score>>p[i].sum>>p[i].anw;
char s;
for(int j = 0; j < p[i].anw; j ++){
cin >> s;
p[i].right += s;   //right存放正确选项集合
}
}
for(int i = 0; i < N; i ++){   //遍历学生
double sco = 0;
scanf("\n");
for(int j = 0; j < M; j ++){   //逐题输入答题信息
if(j != 0) scanf(" ");
string str;
int k;
char s;
int flag=1;
scanf("(%d", &k);   //选项个数
for(int q = 0; q < k; q ++){
scanf(" %c", &s);
str += s;   //str存放学生给出的答案集合
}
scanf(")");
if(str == p[j].right) sco += p[j].score;
else
{
for(int it=0;it<str.size();it++) //遍历答题的错误答案
{
p[j].right.find(str[it]);
if(p[j].right.find(str[it])==-1)
{
flag = 0;
wrong[j][str[it]-'a']++;
if(wrong[j][str[it]-'a']>max)
max=wrong[j][str[it]-'a'];
}
}
for(int it=0;it<p[j].right.size();it++) //遍历漏选的答案
{
if(str.find(p[j].right[it])==-1)
{
wrong[j][p[j].right[it]-'a']++;
if(wrong[j][p[j].right[it]-'a']>max)
max=wrong[j][p[j].right[it]-'a'];
}
}
if(flag==1) sco=sco+p[j].score/2.0;
}
printf("%.1f\n", sco);
}

if(max==-1)
{
cout<<"Too simple";
}
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: