陌陌的pat乙级题解
题解
逻辑题 |
---|
确实感觉我写的有点麻烦,不过感觉还算比较好理解 |
首先要知道的是:错误选择是指 错选 和 漏选(正确的不够) |
我的数据结构: |
1. 两个二维数组,记录错的次数 和 正确性 |
2. 一个map<int,set> 记录每道题的正确答案,目的是为了判断漏选 |
Code
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
vector<vector<int>> error_cnt(M + 5, vector<int>(130)), Right(M + 5, vector<int>(130));
map<int, set<char>> rap;
for (int i = 1; i <= M; i++)
{
int x, y, k;
cin >> x >> y >> k;
Right[i][0] = x;
Right[i][1] = y;
Right[i][2] = k;
char t;
while (k--)
{
cin >> t;
rap[i].insert(t);
Right[i][t] = 1;
}
}
int maxt = -1;
while (N--)
{
char t;
int k;
char x;
double sum = 0;
for (int i = 1; i <= M; i++)
{
cin >> t >> k;
bool f = true;
set<char> ret;
while (k--)
{
cin >> x;
if (Right[i][x] == 1)
{
ret.insert(x);
}
else
{
f = false;
error_cnt[i][x]++;
maxt = max(maxt, error_cnt[i][x]);
}
}
for (auto e : rap[i])
{
if (ret.count(e) == 0)
{
error_cnt[i][e]++;
maxt = max(maxt, error_cnt[i][e]);
}
}
cin >> t;
if (f == false)
{
continue;
}
else if (ret.size() != Right[i][2] && ret.size() > 0)
{
sum += 1.0 * Right[i][0] / 2;
}
else if (ret.size() == Right[i][2])
{
sum += Right[i][0];
}
}
printf("%.1f\n", sum);
}
if (maxt == -1)
{
cout << "Too simple\n";
}
else
for (int i = 1; i <= M; i++)
{
for (int j = 'a'; j <= 'z'; j++)
{
if (error_cnt[i][j] == maxt)
{
cout << maxt << " " << i << "-" << (char)j << endl;
}
}
}
return 0;
}