答题卡 / T1
题目大意
跟你每个学生的名字,试卷填涂情况,以及答案,要你求每个学生的分数,并规范它们的名字。
题目有部分分和大分,选中一些且有选有部分分(不能选错),刚好都中有大分。
思路
依照题目模拟即可。
要注意的是第二个名字第一个大写它第一个字母不一定在第一个位置,第一个位置可能是
′
,
−
',-
′,− 这样的东西,要找到第一个字母。
(记得全部不选没有分)
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node {
int score, an;
char a[201];
}a[101];
int n, m, all[101], some[101], ansn[101], ansnum[101];
bool ans[101][5], kong[101], someans[101];
char tmp[5];
bool cmp(node x, node y) {
if (x.score != y.score) {
return x.score > y.score;
}
int tmp = max(x.an, y.an);
for (int i = 1; i <= tmp; i++) {
if (x.a[i] == ' ' && y.a[i] != ' ') {
return 1;
}
if (x.a[i] != ' ' && y.a[i] == ' ') {
return 0;
}
if (i > x.an) return 1;
if (i > y.an) return 0;
if (x.a[i] != y.a[i]) return x.a[i] < y.a[i];
}
return 0;
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%s", a[i].a + 1);
a[i].an = strlen(a[i].a + 1);
a[i].an++;
a[i].a[a[i].an] = ' ';
scanf("%s", a[i].a + a[i].an + 1);
a[i].an = strlen(a[i].a + 1);
bool op = 0, fir = 0;
for (int j = 1; j <= a[i].an; j++) {
if (a[i].a[j] == ' ') {
op = 1;
continue;
}
if (!op) {
if (a[i].a[j] >= 'a' && a[i].a[j] <= 'z')
a[i].a[j] = a[i].a[j] - 'a' + 'A';
}
else {
if (!fir) {
fir = 1;
if (a[i].a[j] >= 'a' && a[i].a[j] <= 'z') {
a[i].a[j] = a[i].a[j] - 'a' + 'A';
}
else if (a[i].a[j] == '-' || a[i].a[j] == '\'') fir = 0;
}
else {
if (a[i].a[j] >= 'A' && a[i].a[j] <= 'Z')
a[i].a[j] = a[i].a[j] - 'A' + 'a';
}
}
}
}
for (int i = 1; i <= m; i++) {
scanf("%d %d %s", &all[i], &some[i], tmp + 1);
ansn[i] = strlen(tmp + 1);
for (int j = 1; j <= ansn[i]; j++)
ans[i][tmp[j] - 'A' + 1] = 1;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
kong[j] = 1; someans[j] = 1;
ansnum[j] = 0;
}
for (int j = 1; j <= 4; j++) {
scanf("%s", tmp + 1);
for (int k = 1; k <= m; k++) {
if (tmp[k] == 'X') kong[k] = 0;
if (tmp[k] == 'X' && ans[k][j]) ansnum[k]++;
if (tmp[k] == 'X' && !ans[k][j]) someans[k] = 0;
}
}
for (int j = 1; j <= m; j++) {
if (kong[j]) continue;
if (someans[j] && ansnum[j] == ansn[j]) {
a[i].score += all[j];
}
else if (someans[j]) a[i].score += some[j];
}
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
printf("%d ", a[i].score);
for (int j = 1; j <= a[i].an; j++)
putchar(a[i].a[j]);
printf("\n");
}
return 0;
}