就是懒, 用 stl 容器, 希望某位大佬调教
#include <bits/stdc++.h>
#define fre(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define heap priority_queue
using namespace std;
typedef long long ll;
char buf[1 << 23], *p1 = buf, *p2 = buf;
// #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
inline ll read()
{
ll s = 0;
char ch = getchar(), last;
while (ch < '0' || ch > '9')
last = ch, ch = getchar();
while (ch >= '0' && ch <= '9')
s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
return last == '-' ? -s : s;
}
const int N = 1e3 + 10;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
struct Student
{
int self_point;
int tim;
};
bool cmp(Student a, Student b)
{
return a.self_point == b.self_point ? a.tim < b.tim : a.self_point < b.self_point;
}
Student a[N];
int n, k;
map<char, vector<Student>> tim;
int point[N][N];
int main()
{
n = read(), k = read();
for (int i = 1; i <= n; i++)
{
scanf("%d %c", &a[i].self_point, &a[i].tim);
tim[a[i].tim].push_back(a[i]);
}
for (int i = 1; i <= n; i++)
{
a[i].self_point = 0, a[i].tim = 0;
}
for (int i = 1; i <= k; i++)
{
for (int j = 1; j <= k; j++)
{
point[j][i] = read();
}
}
vector<Student> kk;
for (int i = 1; i <= k; i++)
{
int sum1 = 0, sum2 = 0, cnt = 0;
for (int j = 1; j <= k; j++)
{
sum1 += point[i][j];
}
sum1 = round(1.0 * sum1 / k);
for (int j = 1; j <= k; j++)
{
if (abs(point[i][j] - sum1) <= 15)
{
cnt++;
sum2 += point[i][j];
// printf("%d ", point[i][j]);
}
}
// printf("\n");
sum2 = round(1.0 * sum2 / cnt);
for (auto j : tim[(char)i + 'A' - 1])
{
j.self_point = round(j.self_point * 0.6 + sum2 * 0.4);
kk.push_back(j);
}
}
sort(kk.begin(), kk.end(), cmp);
while (!kk.empty())
{
auto i = *(kk.end() - 1);
printf("%d %c\n", i.self_point, i.tim);
kk.pop_back();
}
return 0;
}