#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct {
float num;
char teem;
}Tee;
int main() {
int n, k; scanf("%d%d", &n, &k);
Tee* nums = (Tee*)malloc(sizeof(Tee) * n);
for (int i = 0; i < n; i++) {
scanf("%f", &nums[i].num);
//getchar();
nums[i].num *= 0.6;//直接存入乘以百分之六十的理论成绩
scanf("%c", &nums[i].teem);//输入对应的队伍信息
}
int reciveNum[k][k];//里面参数存k和k,存收到的分数
float average[k]; memset(average, 0, sizeof(average));
for (int i = 0; i < k; i++) {
for (int j = 0; j < k; j++) {
scanf("%d", &reciveNum[i][j]);
}
}
for (int i = 0; i < k; i++) {
int sum = 0;
for (int j = 0; j < k; j++) {
sum += reciveNum[j][i];//将每一列的分数加起来
}
average[i] = sum / k;
//printf("第%d组的平均分为%.1f\n", i + 1, average[i]);
}
//对小组成绩进行评定
int tmpNum = 0; //tmp用来遍历个人成绩
for (int i = 0; i < k; i++) {
int newSum = 0;
int newNum = 0;//表明需要修改平均值
for (int j = 0; j < k; j++) {
if (reciveNum[j][i]>=average[i] - 15 && reciveNum[j][i]<=average[i] + 15) {
//如果平均分差别不超过15
newSum += reciveNum[j][i];
newNum++;
}
}
//里面for循环结束后,就要重新计算最后的平均值
if (newNum != k) {
//说明需要对average[i]进行更改
average[i] = (float)(newSum / newNum) * 0.4;
}
else {
average[i] *= 0.4;
}
//最后统计最终成绩,然后进行排序
while (nums[tmpNum].teem == nums[tmpNum + 1].teem) {
nums[tmpNum].num += average[i];//得到该人的最终成绩
//printf("得到最终成绩%.1f--->%c\n", nums[j].num, nums[j].teem);
tmpNum++;
}
nums[tmpNum].num += average[i];
//printf("得到最终成绩%.1f--->%c\n", nums[j].num, nums[j].teem);
tmpNum++;
//printf("经过修改后第%d组的平均成绩为%.1f\n", i + 1, average[i]);
}
//采用逆向冒泡排序对整个数组进行排序(将值大的放在头部)
//printf("经过逆向冒泡排序,得到的顺序如下:\n");
int a = 0;
Tee tmp;//用来做交换的中间变量
for (int i = 0; i < n - 1; i++) {
//最多要进行n-1趟冒泡排序
for (int j = n - 1; j > i; j--) {
if (nums[j].num > nums[j-1].num) {
//将大的值前移
tmp = nums[j - 1];
nums[j - 1] = nums[j];
nums[j] = tmp;
}
}
a = (int)(nums[i].num + 0.5);
printf("%d--->%c\n", a, nums[i].teem);
a++;
}
a = (int)(nums[n-1].num + 0.5);
printf("%d--->%c\n", a, nums[n-1].teem);
return 0;
}