1058 选择题 - PAT (Basic Level) Practice (中文) (pintia.cn)
解析: 58_哔哩哔哩_bilibili
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
struct Point
{
string s;
int score;
}str[105];
int cnt[105], sum[1005];
bool check(string s, int m)
{
int k = 0;
//遍历整个字符串
for (int i = 0; i < s.size(); i++)
{
if (str[m].s.find(s[i]) == -1)return false; //如果在正确选项中找不到用户输入的选项 ,说明用户输入的是错误选项
k++; //否则就到下一个选项上 ,继续判断
}
return k == str[m].s.size(); //如果用户输入的选项个数和正确选项个数一致,说明用户输入的选项全是正确的
}
int main()
{
int n, m; cin >> n >> m;
for (int i = 0; i < m; i++)
{
cin >> str[i].score; //满分值
int t; cin >> t >> t; //选项个数没有用,直接让正确选项个数覆盖
//输入正确选项
for (int j = 1; j <= t; j++)
{
string x; cin >> x;
str[i].s += x; //把正确答案存到字符串中
}
}
//for(int i=0;i<m;i++)cout<<str[i].score;
//用户输入
string s; getline(cin, s);
for (int i = 0; i < n; i++)
{
getline(cin, s);
int t = 0; //t用来表示哪一道题
string temp;
for (int j = 0; j < s.size(); j++)
{
if (s[j] >= 'a' && s[j] <= 'z')
temp += s[j]; //用户输入的答案也存为一个字符串
if (s[j] == ')') //选项读取完了
{
if (check(temp, t))sum[i] += str[t].score;
else cnt[t]++;
t++;
temp.clear(); //清空字符串
}
}
}
for (int i = 0; i < n; i++)cout << sum[i] << endl;
//输出错误次数和编号
int ans = 0;
for (int i = 0; i < m; i++)
if (ans < cnt[i])ans = cnt[i];
if (ans) //如果错误次数不为0
{
cout << ans; //输出错误如果错误次数
for (int i = 0; i < m; i++)
if (cnt[i] == ans)cout << " " << i + 1;
}
else cout << "Too simple" << endl;
return 0;
}