题目网址
https://pintia.cn/problem-sets/994805260223102976/problems/994805270356541440
思路
注意下输入的格式,用scanf处理。第1个测试点输出Too simple前先输出每个人的分数,然后输出Too simple,直接return 0。
data二维数组中,每一行最后一个存那道题的分数,倒数第二个存正确选项的个数。
代码
#include<iostream>
#define MAX 1005
using namespace std;
int data[MAX][MAX] = {0};
int vis[MAX] = {0};
int main() {
int n;
int m;
int score;
int num;
int num_right;
char c;
int N;
int sum = 0;
char temp;
int flag;
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i ++) {
scanf("%d %d %d", &score, &num, &num_right);
for (int j = 1; j <= num_right; j ++) {
scanf(" %c", &c);
c = tolower(c);
if (c >= 'a' && c <= 'e')
data[i][c - 'a' + 1] = 1;
}
data[i][0] = score;
data[i][MAX - 2] = num_right;
}
for (int i = 1; i <= n; i ++) {
scanf("\n");
for (int j = 1; j <= m; j ++) {
if (j > 1)
scanf(" ");
scanf("(%d", &N);
flag = 0;
if (N != data[j][MAX - 2])
flag = 1;
for (int k = 1; k <= N; k ++) {
scanf(" %c", &c);
c = tolower(c);
if (c >= 'a' && c <= 'e')
if (data[j][c - 'a' + 1] <= 0)
flag = 1;
}
scanf(")");
if (flag <= 0)
data[i][MAX - 1] += data[j][0];
else {
vis[j] ++;
sum ++;
}
}
}
for (int i = 1; i <= n; i ++ )
cout << data[i][MAX - 1] << endl;
if (sum <= 0) {
cout << "Too simple";
return 0;
}
int TheMax = -1;
int cnt = 0;
for (int i = 1; i <= m; i ++)
if (vis[i] > TheMax)
TheMax = vis[i];
cout << TheMax;
for (int i = 1; i <= m; i ++) {
if (vis[i] == TheMax)
cout << " " << i;
}
return 0;
}