题目:写个程序帮助老师批改多选题,并且指出哪道题错的人最多。
输入格式:
第一行:正整数N和M,分别是学生人数和多选题个数。
随后M行:每行顺次给出满分值[1,5]、选项个数[2,5]、正确选项个数[1,5]、所有正确选项。
最后N行:每行给出一个学生的答题情况。
注意:题目保证学生的答题情况是合法的,即不存在选中的选项数超过实际选项数的情况。
输出格式:
按照输入的顺序给出每个学生的得分,每个分数占一行。
最后一行输出错得最多的题目的错误次数和编号。如果有并列,则按编号递增顺序输出。
如果所有题目都没有人错,则在最后一行输出
Too simple。
思路:保存正确答案和学生的答案,依次比较是否作答正确,并设置错误次数数组,记录每道题的错误次数。
代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main(){
int n,m;cin >> n >> m;
int * errorArr = new int[m];for(int i = 0 ; i < m ; i ++) errorArr[i] = 0;
vector<string> v; // 保存正确答案
for(int i = 0 ; i < m ; i ++){
int fullScore,optionNum,trueNum;
// 满分值[1,5]、选项个数[2,5]、正确选项个数[1,5]
cin >> fullScore >> optionNum >> trueNum;
// 所有正确选项
string temp = "";
for(int j = 0 ; j < trueNum ; j ++){
char ch;cin >> ch;
temp += ch;
}
// 记录每道题的满分值和正确选项
v.push_back(to_string(fullScore)+to_string(trueNum)+temp);
}
cin.ignore();
for(int k = 0 ; k < n ; k ++){
string s = "";getline(cin,s);
vector<string> stu; // 记录该学生的答题情况
string temp = "";
for(unsigned int i = 0 ; i < s.size() ; i ++){
if(s[i] == ')'){
stu.push_back(temp);
}else if(s[i] == '('){
temp = "";
}else if(s[i] == ' '){
continue;
}else{
temp += s[i];
}
} // for -- 读入答题情况
int score = 0;
for(unsigned int i = 0 ; i < stu.size() ; i ++){
if(stu[i] == v[i].substr(1,v[i].size()-1)){
score += (v[i][0] - '0');
}else{
errorArr[i] ++; // 第i+1道题错了errorArr[i]次
}
}
cout << score << endl;
} // for - 求n个学生的得分情况
int maxIndex = 0; // 第maxIndex+1题目错的最多
for(int i = 1 ; i < m ; i ++){
if(errorArr[i] >= errorArr[maxIndex])
maxIndex = i;
}
// 按题目要求进行输出
if(errorArr[maxIndex] == 0)
cout << "Too simple" << endl;
else{
cout << errorArr[maxIndex] << " ";
for(int i = 0 ; i < m ; i ++){
if(errorArr[i] == errorArr[maxIndex]){
cout << i + 1;
if(i != maxIndex)
cout << " ";
}
}
cout << endl;
}
return 0;
}