1058 选择题 (20 分)

本文介绍了一个用于处理复杂多选题评分的C++程序实现,包括使用结构体存储题目信息、通过set进行选项匹配及错误计数,最后按错误次数排序输出错误最多的题目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这种题本身不难,但是题干超级无敌长,容易使人头晕眼花 ......

代码:

#include<bits/stdc++.h>
using namespace std;
struct quesion {
	// 题号,本题的满分值,选项个数,正确选项个数,学生的错误次数
	int no,sc,optnum,rightnum=0,wrong_cnt=0;
	set<char> opt;	//	*:review一下set的特性
} que[1001];
int cmp(quesion a, quesion b) {
	if(a.wrong_cnt!=b.wrong_cnt)
		return a.wrong_cnt>b.wrong_cnt;
	else return a.no<b.no;
}
int main() {
	int n,m,cnt=0;
	cin>>n>>m;	//	学生人数,多选题个数
	for(int i=0; i<m; i++) {
		cin>>que[i].sc>>que[i].optnum>>que[i].rightnum;
		que[i].no=i;
		for(int j=0; j<que[i].rightnum; j++) {
			char a;
			cin>>a;
			que[i].opt.insert(a);
		}
	}
	for(int i=0; i<n; i++) {
		int score=0,l;	//	每个学生的成绩
		char a;
		scanf("\n");
		for(int j=0; j<m; j++) {
			cnt=0;
			if(j>0) scanf(" ");
			scanf("(%d",&l);
			for(int k=0; k<l; k++) {
				scanf(" %c",&a);
				if(que[j].opt.find(a)!=que[j].opt.end()) cnt++; // 在本题正确答案的选项中能找着
			}
			scanf(")");
			if(cnt==que[j].rightnum&&l==que[j].rightnum) { // *注意这个条件,此题回答正确 
				score+=que[j].sc;
			} else { //此题回答错误
				que[j].wrong_cnt++; 
			}
		}
		cout<<score<<endl;	//输出每名同学的成绩
	}
	sort(que,que+m,cmp);    //	*:review一下结构体数组、vector等咋sort()
	cnt=que[0].wrong_cnt;
	if(cnt==0){  // 没有错误 
		cout<<"Too simple";
		return 0;
	}
	cout<<cnt;
	for(int i=0; i<m; i++) {
		if(cnt==que[i].wrong_cnt) cout<<" "<<que[i].no+1;
		else break;
	}
	return 0;
}

总结:

1、set 是集合,⼀个 set 中的各元素各不相同,而且 set 会按照元素从小到大排序,用法:

set<int> s; // 定义⼀个空集合s
s.insert(1); // 向集合s⾥⾯插⼊⼀个1
cout << *(s.begin()) << endl; // 输出集合s的第⼀个元素 (前⾯的星号表示要对指针取值)
/*
查找集合s中的值,
如果结果等于s.end()表示未找到 
(因为s.end()表示s的最后⼀个元素的下⼀个元素所在的位置)
*/
if(s.find('a')!=s.end())
    cout<<"能找到";

2、注意以下 scanf() 的用法:

scanf("("%d", &a);
scanf(")");

3、结构体数组、vector咋sort?

struct stu {
    int number; //学号
    int score;  //分数
}

bool cmp(stu a, stu b) { // cmp函数,返回值是bool,传⼊的参数类型应该是结构体stu类型
     if (a.score != b.score) // 如果学⽣分数不同,就按照分数从⼤到⼩排列
     return a.score > b.score;
     else // 如果学⽣分数相同,就按照学号从⼩到⼤排列
         return a.number < b.number;
}

sort(v.begin(), v.end(), cmp);
sort(array, array + 10, cmp);

提交记录:

 做这样的题一定要仔细,头脑要清楚。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值