Xepa Legends 是一个第一人称射击类大逃杀(“吃鸡”)游戏,每局游戏共有 20 支 3 人小队参加,最后获胜的队伍被称为“捍卫者”。
最近 Xepa Legends 举行了亚太地区南赛区的线上比赛,争夺 7 个前往德国曼海姆参加线下赛的资格,国内共有 14 支队伍参与到了其中。因为比赛十分激烈,直到最后谁进了线下仍有巨大的疑问。小 K 喜欢的国内知名战队 DreamTear 因其队内选手杀马特表现不佳,正好卡在出线分数前后,请你赶紧帮帮小 K,计算一下最后的分数情况,看看他喜欢的战队出线了没有吧!
Xepa Legends 的常规赛共有 30 支队伍参加,被分为三组,进行 N 轮比赛,每轮由三组中的两组组成 20 支队伍的参赛阵容,进行若干场比赛,最后每个队伍会获得一个当轮比赛的排名。
对于每轮比赛,队伍会根据排名获得一个在当轮比赛的赋分:
排名 分数
第一名 25 分
第二名 21 分
第三名 18 分
第四名 16 分
第五名 15 分
第六名 14 分
第七名 13 分
第八名 12 分
第九名 11 分
第十名 10 分
第十一名 9 分
第十二名 8 分
第十三名 7 分
第十四名 6 分
第十五名 5 分
第十六名 4 分
第十七名 3 分
第十八名 2 分
第十九名 1 分
第二十名 0 分
给定若干轮比赛队伍获得的当轮比赛排名,请你计算出队伍的赋分,并在若干轮比赛后计算出总赋分,从而最终确定 DreamTear 战队能否进入线下,还是只能耍耍花招了。
例如,
DreamTear 战队在第一轮比赛中获得了第 17 名,第三轮比赛中获得了第 11 名,第四轮比赛中获得了第 11 名,那么 DreamTear 战队可获 3 + 9 + 9 = 21 分的赋分;
KV 战队在第一轮比赛中获得了第 10 名,第三轮比赛中获得了第 2 名,第四轮比赛中获得了第 6 名,那么他们可获得 10 + 21 + 14 = 45 分的赋分。
注:本题与实际情况无关,所有比赛规则、队伍、队员名称均为虚构。
输入格式:
输入第一行是一个正整数 N (≤20),表示有 N 轮比赛。
接下来有 N 部分输入,每部分是一轮比赛的情况。对每一场比赛,信息共分 20 行,第 i 行(i=1,⋯,20)给出的两个非负整数 c 和 p 表示编号为 c 的队伍在这轮比赛里获得了第 p 名。
数据保证所有给定的情况中,排名永远大于等于 1 且小于等于 20,队伍编号由 1 开始,不超过 30。
输出格式:
输出若干行,按分数从大到小依次输出队伍的编号及该队所有轮次游戏结束后的总分。如分数相同,队伍编号较小的先输出。
注意由于统计的时候比赛可能并没有完全结束,所以每个队伍参加的比赛轮数不一定相同,此时仍然正常计分统计即可。不要输出未参赛的队伍分数。
输入样例:
3
1 1
2 2
9 3
6 4
7 5
11 6
3 7
13 8
8 9
16 10
4 11
19 12
17 13
5 14
12 15
15 16
14 17
10 18
20 19
18 20
5 11
10 12
30 13
22 14
1 1
28 20
21 16
26 17
2 2
24 3
4 4
29 5
8 6
7 15
6 7
3 8
9 9
25 10
23 19
27 18
19 20
26 19
27 18
18 17
21 16
12 15
28 14
20 13
17 12
14 11
13 10
23 9
29 8
22 7
30 6
15 5
24 4
25 3
16 2
11 1
输出样例:
1 50
2 42
11 39
24 34
16 31
6 29
9 29
25 28
29 27
3 25
4 25
8 25
13 22
30 21
7 20
15 19
22 19
5 15
17 15
14 12
23 12
10 10
12 10
19 8
20 8
21 8
28 6
26 4
27 4
18 3
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
栈限制 8192 KB
#include <bits/stdc++.h>
using namespace std;
struct d
{
int x, y;
}a[50];
bool cmp(d a, d b)
{
if (a.y != b.y) return a.y > b.y;
else return a.x < b.x;
}
int main()
{
int n;
cin >> n;
map<int, int> mp;
while (n--)
{
for (int i = 0; i < 20; i++)
{
int c, p;
cin >> c >> p;
if (p == 1) mp[c] += 25;
if (p == 2) mp[c] += 21;
if (p == 3) mp[c] += 18;
if (p == 4) mp[c] += 16;
if (p == 5) mp[c] += 15;
if (p == 6) mp[c] += 14;
if (p == 7) mp[c] += 13;
if (p == 8) mp[c] += 12;
if (p == 9) mp[c] += 11;
if (p == 10) mp[c] += 10;
if (p == 11) mp[c] += 9;
if (p == 12) mp[c] += 8;
if (p == 13) mp[c] += 7;
if (p == 14) mp[c] += 6;
if (p == 15) mp[c] += 5;
if (p == 16) mp[c] += 4;
if (p == 17) mp[c] += 3;
if (p == 18) mp[c] += 2;
if (p == 19) mp[c] += 1;
if (p == 20) mp[c] += 0;
}
}
int idx = 0;
for (auto [u, v] : mp)
{
a[idx++] = { u, v };
}
sort(a, a + idx, cmp);
for (int i = 0; i < idx; i++)
{
cout << a[i].x << ' ' << a[i].y << '\n';
}
}