PAT 1058 选择题 25分

51 阅读1分钟

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;
}