【问题描述】
XX中学新一季的足球联赛开幕了。足球联赛有 n只球队参赛,每赛季,每只球队要与其他球队各赛两场,主客各一场,赢一场得 3 分,输一场不得分,平局两只队伍各得一分。
英勇无畏的小鸿是机房的主力前锋,她总能在关键时刻踢出一些匪夷所思的妙球。但是很可惜,她过早的燃烧完了她的职业生涯,不过作为一个能够 Burning 的 girl,她的能力不止如此,她还能预测这个赛季所有球队的比赛结果。
虽然她能准确预测所有比赛的结果,但是其实她不怎么厉害,Mr.Gao 上数学课时她总是在 sleep,因此她的脑里只有整数没有实数,而且,她只会 10 以内非负整数的加法运算,因此她只有结果却无法知道谁会获得联赛的冠军。
小鸿想给冠军队伍的所有队员一个拥抱,所以她把计算结果的任务交给了你:现在,给你一个 n*n 的矩阵表示比赛情况。第 i 行第 j 列的字母表示在第 i 只队伍在主场迎战第 j 只队伍的比赛情况,W 表示主队赢,L 表示主队输,D 表示平局。现在需要你给出最后能得到小鸿拥抱的队伍编号,如有多支队伍分数最高,按字典序输出编号。
【输入样例】
第一行一个整数 n。
接下来 n 行,每行 n 个字符,表示输赢情况。第 i 行第 i 列为 - ,因为一只队伍不可能与自己比赛。
【输出格式】
输出得分最高的队伍编号。如有多个在一行中输出,用一个空格分开。
【思路梳理】
容笔者吐槽一下:这道题废话实在太多,整段描述大段大段全是无用信息,啰嗦冗长!这就算了,而且还十分的水!数据规模小得出奇,裸搜遍历就可以AC。
需要指出的几点:
- 注意的是这个比赛记录与大多数同类型表格不大相同,这张表格中的每一场比赛都是不同的,第i行第j列的比赛代表的是i队和j队在i队的主场进行比赛,第j行第i列代表的则是i队和j队在j队的主场进行的比赛(一个中学的足球场能有50个?),两者的含义不同。
对于第i行第j列的比赛,如果为“W”,显然主场队i队的三分;但如果为“L”,要记得客场队要得到3分。
【Cpp代码】
#include<cstdio>
#include<iostream>
#include<Queue>
#define maxn 55
using namespace std;
struct data
{
int s,id;
friend bool operator<(data a,data b)
{
return ((a.s<b.s)|| (a.s==b.s && a.id>b.id));
}
};
priority_queue<data>q;
int n,score[maxn];
char record[maxn][maxn];
void solve()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)if(i!=j)
{
if(record[i][j]=='W') score[i]+=3;
else if(record[i][j]=='L') score[j]+=3;
else if(record[i][j]=='D')
{
score[i]++;
score[j]++;
}
}
for(int i=1;i<=n;i++) q.push((data){score[i],i});
data t=q.top();q.pop();
cout<<t.id;
while(!q.empty())
{
data t1=q.top();q.pop();
if(t1.s==t.s) cout<<" "<<t1.id;
else break;
}
}
int main()
{
//freopen("football.in","r",stdin);
// freopen("football.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
char ch=getchar();
while(ch!='-' && ch!='W' && ch!='D' && ch!='L') ch=getchar();
record[i][j]=ch;
}
solve();
return 0;
}