1073 多选题常见计分法

在这里插入图片描述
在这里插入图片描述
思路解析:本题可以通过结构体建立实际问题模型求解,也可以利用面向过程的思想,结合二进制的知识省去很多不必要的操作。第一种方法实现起来并不难,但会显得代码冗余,在这里对第二种进行讲解。

本算法核心思想是二进制的与或运算。
1⊕1=0、1⊕0=1、0⊕1=1、0⊕0=0

下面进行分析:
分别用00001、00010、00100、01000、10000 表示A、B、C、D、E五个选项,注意在存储时是存储的对应的十进制形式,也就是1、2、4、8、16

将每道题的正确答案用二进制表示并存储起来。
如答案为ABE则对应的二进制信息是00001 + 00010 + 10000 = 10011,注意,二进制运算是在计算机内部实现的,实际操作的数仍然是十进制,比如我们对00001和00010进行与运算,实际输入的数据是“1 & 2”,计算机会自动转成二进制,而不是我们手动输入二进制数的。

批卷过程是这样的:
首先将学生该题的全部选项与正确选项进行与或运算,若结果为0则说明答案正确,否则说明有错,哪一位为1说明那个选项出错,注意:错选与空选均算出错。
比如学生答案是10001,正确答案是10101,与或结果为00100,对应的十进制是4不是0,说明有错,而其对应的选项是C,说明该学生的C项出错。

示例代码:

#include<iostream>
#include<vector>
#include<iomanip>
using namespace std;
int main(){
	int n,m; cin >> n>> m;
	int hash[] = {1,2,4,8,16};//00001 00010 00100 01000 10000 
	vector<int> trueopt(m);//m道选择题的正确答案二进制信息对应的十进制数
	int* fullscore = new int[m];//m道选择题的满分值
	for(int i = 0; i < m; i++){//读题
		int score, optnum, trunum;
		scanf("%d %d %d",&score,&optnum,&trunum);
		fullscore[i] = score;
		for(int j = 0; j < trunum; j++){//读选项
			char temp;
			scanf(" %c",&temp);
			trueopt[i] += hash[temp-'a'];//将所选答案信息全部读入到opt
		}
	}
	vector<vector<int>> cnt(m,vector<int> (5));//二维数组 存储每道题每个选项的错误次数
	for(int i = 0; i < n; i++){//执行n次 扫描每个学生
		double grade = 0;
		vector<int> stuopt(m);//创建临时数组 存储学生的答题情况
		for(int j = 0; j < m; j++){//执行m次 扫描每道题
			getchar();
			int num; //学生选中的项数
			scanf("(%d",&num);
			for(int k = 0; k < num; k++){
				char temp;
				scanf(" %c)",&temp);//捎带着吃掉末尾的)
				stuopt[j] += hash[temp-'a'];
			}
		}
		for(int k = 0; k < m; k++){//执行m次 扫描学生选中的每道题
			int el = stuopt[k] ^ trueopt[k];//进行与或运算
			if(el){//大于0 说明有错误
				if((el | trueopt[k]) == trueopt[k]){//将漏选的补上
					grade += (double)fullscore[k]/2;
				}
				if(el){//统计错误信息
					for(int j = 0; j <5; j++){//执行5次 选中5个选项
					//el存储的是有歧义的选项 所以这些选项就是所求答案
					if(el & hash[j]){
						cnt[k][j]++;
					}
				}
			}
				
			}else{
				grade += fullscore[k]*1.0;
			}
		}
		
		cout<<setprecision(1)<<fixed<<grade<<endl;
	}
		int max = 0;	//选出错的最多的那个选项
		for(int i = 0; i < m; i++){
			for(int j = 0; j < 5; j++){
				max = cnt[i][j] > max ? cnt[i][j] : max;
			}
		}
		if(!max){	//输出这些选项
			cout<<"Too simple"<<endl;
		}else{
			for(int i = 0; i < m; i++){
				for(int j = 0; j < 5; j++){
					if(cnt[i][j] == max){
						cout<<max<<" "<<i+1<<"-"<<char(j+'a')<<endl;
					}
				}
			}
		}
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多选题常见计分包括以下几种: 1. 全对得分:只有当考生全部选对所有选项时才能得到满分,否则得分为分。 2. 部分得分:考生只要选对一部分选项就能得到相应的分数,未选对的选项不计分。 3. 加权得分:对于每个选项都有一个不同的分值,考生选对该选项就能得到相应的分数,未选对的选项不计分。 4. 惩罚得分:考生选错一个选项就会扣除一定的分数,选对一个选项则不计分。 5. 混合得分:将以上几种计分进行组合,根据具体情况进行计分。 ### 回答2: 多选题是指一个问题有多个选项可以选择,考生可以选择一个或多个选项进行回答。多选题的评分方根据不同的考试,可能有不同的规定,但是在一般情况下,常见计分包括以下几种: 1. 全对得分:如果考生选择的所有选项都是正确的,那么就可以得到全部的分数,反之不得分。 2. 部分得分:如果考生选择的选项中有正确的选项,那么可以得到部分的分数,分数的多少取决于考试规定的计分方式。 3. 漏选扣分:如果考生漏选了正确的选项,那么会扣除一定的分数,扣分的多少也取决于考试规定的计分方式。 4. 错选扣分:如果考生选了错误的选项,那么会扣除一定的分数,扣分的多少也取决于考试规定的计分方式。 多选题的评分方需要考生在考前了解并熟练掌握,以便在考试中能够正确地选出答案,并最大化自己的得分。同时,在回答多选题的时候,也要注意考试规定的答题方式,如是否必须选满所有选项、是否允许重复选项等等。只有掌握了正确的答题技巧和考试规定,才能在多选题中获得好的成绩。 ### 回答3: 多选题常见计分是指在多选题测试中,为了更好地评估学生的知识水平和能力,通常采用的计分方式。以下是多选题常见计分: 1. 全对或全错计分 全对或全错计分多选题常见计分方式。在这种计分方式下,如果学生作答全部正确,则得满分,即使选了多余的选项也不影响成绩。反之,如果有任何一项选错,则全部错,得零分。 2. 部分计分 部分计分是指在多选题中,如果学生选对了一部分选项,但其他选项选择错误,则根据正确选项的比例给予相应的分数。例如,如果一道题目共有4个选项,其中有3个选对,1个选错,则该学生可以得到75%的分数。 3. 错扣分计分 错误扣分计分是指在多选题中,学生在选择错的选项上扣除一定分数,而在选择正确的选项上得到相应的分数。这样可以更好地让学生注意考虑每个选项的正确性,并减少随意猜测的情况。 总之,不同的计分方式在多选题考试中起到不同的作用,可以根据需要和目的来选择相应的计分方式,以更好地评估学生的知识水平和能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值