思路分析:
本题解决思路有两种,第一种是创建结构体,用面向对象的思想解决问题,更容易理解,但有可能会使代码显得不是很简练,另外对于本题来讲,有些小题大做了;第二种就是直接处理字符串,阅读起来可能有些吃力,但是代码会更紧凑,而且可以装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;
}