题面
排球比赛排名
在某单位举办的排球联赛中,共有N(1<N≤10)支球队进行了单循环比赛,最后进行排名。比赛采用五局三胜制,胜三局的队胜一场,按照以下标准和顺序确定最终排名:
(1) 胜场:指比赛中获胜的比赛场次数量。
(2) 积分:比赛结果为 3:0 或 3:1时,胜队积 3 分,负队积 0 分;比赛结果为 3:2 时,胜队积 2 分,负队积 1 分。
(3) 胜场多者排名在前,胜场相同时,积分多者排名在前,胜场和积分相同时,并列名次,为简单起见,队伍名称按照字典序显示排名顺序。
以N为4为例,用矩阵形式给出4支名称分别为Brante、Douglas、Gardenia和Andrew的赛队之间的比赛结果,3:2、3:1和3:0的比分分别用正整数5、4、3表示,对应地,2:3、1:3和0:3的比分分别用负整数-5、-4和-3表示,如下表所示。
表1
Brante | Douglas | Gardenia | Andrew | |
Brante | 0 | 5 | -4 | 3 |
Douglas | -5 | 0 | 3 | 4 |
Gardenia | 4 | -3 | 0 | 5 |
Andrew | -3 | -4 | -5 | 0 |
表1中,Brante与Douglas队的比赛结果为3:2,在上述矩阵中第1行第2列用正整数5表示,对应地,在第2行第1列用-5表示Douglas与Brante的比赛结果为2:3,Brante与Gardenia队的比赛结果为1:3,因此在第1行第3列用-4表示,对应地,在第3行第1列用4表示Gardenia与Brante队的比赛结果为3:1,其余类推。
请编写程序,根据比赛结果,按照上述规则输出最终排名。
输入说明:
输入的第一行是队伍数N和N支队伍的名称(长度不超过12的字符串);
接下来分N行、每行N个整数,表示比赛结果。
输出说明:
输出分为N行,按照排名顺序每行输出一个队名、胜场数和积分,之间用一个空格分隔。
输入样例:
4 Brante Douglas Gardenia Andrew
0 5 -4 3
-5 0 3 4
4 -3 0 5
-3 -4 -5 0
输出样例:
Douglas 2 7
Brante 2 5
Gardenia 2 5
Andrew 0 1
题解
本题部分对应关系如下:
每次输入的数字 | 比分(我方:对方) | 胜场数 | 积分 |
---|---|---|---|
5 | 3:2 | +1 | +2 |
4 | 3:1 | +1 | +3 |
3 | 3:0 | +1 | +3 |
-5 | 2:3 | 不变 | +1 |
-4 | 1:3 | 不变 | 不变 |
-3 | 0:3 | 不变 | 不变 |
思路:
- 按每行处理,用每行输入算出对应队伍的胜场、积分。
- 使用sort函数按照题意排序
- 按序输出
满分代码(含注释)
#include <iostream>
#include <algorithm>
using namespace std;
int n;
struct Team { // 结构体记录每队的名字、胜场数、总积分
int wins, tot;
string name;
} a[11];
bool cmp (Team x, Team y) // 排序辅助函数
{
if (x.wins == y.wins) // 如果胜场数相等
{
if (x.tot == y.tot) // 如果总积分相等
{
return x.name < y.name; // 按字典序排序
// 没想到吧,string可以直接比较,比较结果就是字典序
// 想到的朋友,好啦好啦,知道你是佬啦
}
return x.tot > y.tot; // 返回总积分多的
}
return x.wins > y.wins; // 返回胜场数多的
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) // 输入每个队的名字
{
cin >> a[i].name;
}
int t;
for (int i = 1; i <= n; i++) // 每行输入就是这个队的总战绩,想不明白的可以自行证明
{
for (int j = 1; j <= n; j++) // 输入一个数处理一个数
{
cin >> t;
switch (t)
{
case 5: // 5对应3:2
a[i].wins ++;
a[i].tot += 2;
break;
case 4: // 4对应3:1,3对应3:0,但是结果一样
case 3:
a[i].wins ++;
a[i].tot += 3;
break;
case -5: // -5对应2:3
a[i].tot += 1;
break;
default: // -4、-3对这个队的胜场数和积分都没有影响
break;
}
}
}
sort (a + 1, a + n + 1, cmp); // 排序
for (int i = 1; i <= n; i++) // 按序输出
{
cout << a[i].name << ' ' << a[i].wins << ' ' << a[i].tot << '\n';
}
return 0;
}
纯享版代码(无注释)
#include <iostream>
#include <algorithm>
using namespace std;
int n;
struct Team {
int wins, tot;
string name;
} a[11];
bool cmp (Team x, Team y)
{
if (x.wins == y.wins)
{
if (x.tot == y.tot)
{
return x.name < y.name;
}
return x.tot > y.tot;
}
return x.wins > y.wins;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i].name;
}
int t;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> t;
switch (t)
{
case 5:
a[i].wins ++;
a[i].tot += 2;
break;
case 4:
case 3:
a[i].wins ++;
a[i].tot += 3;
break;
case -5:
a[i].tot += 1;
break;
default:
break;
}
}
}
sort (a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++)
{
cout << a[i].name << ' ' << a[i].wins << ' ' << a[i].tot << '\n';
}
return 0;
}
date:20240103