1058 选择题

在这里插入图片描述
思路分析:
本题解决思路有两种,第一种是创建结构体,用面向对象的思想解决问题,更容易理解,但有可能会使代码显得不是很简练,另外对于本题来讲,有些小题大做了;第二种就是直接处理字符串,阅读起来可能有些吃力,但是代码会更紧凑,而且可以装B……

思路不难,注释比较详细,就不多写具体步骤了,关键是跟着代码走一遍,用笔画一画,写一写就好理解了。

示例代码:

#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
	int n,m; cin>>n>>m;
	vector<int> times(m);
	vector<string> vec;//存放题库
	scanf("\n","");//吸收掉换行符
	for(int i = 0; i < m; i++){
		string temp;
		getline(cin,temp);
		vec.push_back(temp);
	}
	for(int i = 0; i < n; i++){//读取学生答题答案
		string ans;
		getline(cin,ans);
		int j = 1;//指向每道答题的指针 直接跳过左括号
		int grade = 0;
		for(int k = 0; k < m; k++){//执行m次 扫描每道题
			if(j < ans.length()){
				int inij = j;//记录指针的初始位置
				int num = ans[j] - '0';
				int point = 4;//指向vec题库的指针
				if(vec[k][point] == ans[j]){//答案个数正确
					j += 2; point += 2;//指针下移准备比较选项内容,因为中间有空格所以要加2位
					for(int t = 0; t < num; t++){//根据选择个数,判断选项是否正确
						if(ans[j] != vec[k][point]){
							j += 2; point += 2;
							break;
						}
						if(t == num - 1){//说明答案正确
							grade += vec[k][0] - '0';
							times[k]++;//正确次数+1
						}
						j += 2; point += 2;
					}
				}
				j = inij + num * 2 + 4;//指向下一题
			}
		}
		cout<<grade<<endl;
	}
	int j = 0;//记录正确率最低那道题的角标
	for(int i = 1; i < m; i++){
		if(times[i] <= times[j]) j = i;
	}
	int count = times[j];//统计正确率最低的人数 
	if(times[j] == n){
		cout<<"Too simple";
		return 0;
	}
	cout<<n - count<<" ";
	for(int i = 0; i < m && i < j; i++){
		if(times[i] == times[j]) cout<<i+1<<" ";
	}
	cout<<j+1;
	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值