Ps:图片来源网络,侵权联系删除。
首先题意一定要审清附上原文:“并且指出哪道题的哪个选项错的人最多。”
注意:漏选也要计入选项错误。统计最多选项错误,而非哪一题错误最多。
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<iomanip>
#include<algorithm>
using namespace std;
const int N = 1e3 + 5;
typedef long long ll;
struct node {
int score;
int key;
set<char>ans;//set存储方便判断错选漏选,使用find
}quest[N];
double student[N];
int qst[105][5]; //记录每个选项错误的次数
int maxu = 1; //至少错一次才参与maxu计算
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int score, num, key;
cin >> score >> num >> key;
set<char>ans;
for (int j = 0; j < key; j++) {
char ch;
cin >> ch;
ans.insert(ch);
}
quest[i + 1] = { score,key,ans };
}
char ch;
for (int i = 1; i <= n; i++)
{
double score = 0;
for (int j = 1; j <= m; j++) {//第几题
cin >> ch;//接收'('
int t;
cin >> t;
bool flag = 0;
set<char>ans;
for (int k = 1; k <= t; k++)
{
cin >> ch;
if (quest[j].ans.find(ch) == quest[j].ans.end()) {
flag = 1;
qst[j][int(ch - 'a')]++;
maxu = max(maxu, qst[j][int(ch - 'a')]);//计算该选项错误的次数最大值
}
ans.insert(ch);
}
//漏选
for (auto k : quest[j].ans) {
if (ans.find(k) == ans.end())
{
qst[j][int(k - 'a')]++;
maxu = max(maxu, qst[j][int(k - 'a')]);//计算该选项错误的次数最大值
}
}
if(!flag) {//没有错选才计算分数
if (ans.size() < quest[j].ans.size()) {
score += quest[j].score * 0.5;
}
else if (ans.size() == quest[j].ans.size()) {
score += quest[j].score;
}
}
cin >> ch;//接收')'
}
student[i] = score;
}
//顺序输出学生分数
for (int i = 1; i <= n; i++)
{
cout << fixed << setprecision(1) << student[i] << endl;
}
bool flag = 0;//特判"Too simple"情况
for (int i = 1; i <= m; i++)
{
for (int j = 0; j < 5; j++)
{
if (qst[i][j] == maxu) {
flag = 1;
cout << maxu << ' ' << i << '-' << char(j + 'a') << endl;
}
}
}
if (!flag) {
cout << "Too simple\n";
}
return 0;
}