[工程师死绝的世界B2002]砂漠の公園 翻译及题解
沙漠公园
Translation by KSkun
原题:問題「砂漠の公園」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜
问题描述
以前公园经常举行某种比赛的大会。每次比赛的结果记录都能找到,但是哪只队伍最终获得优胜的记录却丢失了。
因此你需要写一个程序来计算最终是哪只队伍获得了优胜。
大会进行循环比赛,按照以下的方式计算每只队伍的得分。一次比赛获胜得2分,平局得1分,输局得0分。
在所有比赛进行完毕后,得分最多的队伍获得优胜。
输入中包含大会的参赛人数以及比赛结果,请设计程序输出比赛的获胜者以及得分和胜利、平局、失败的场数。
样例1解释如下图所示。
输入格式
N
c_{1,1}c_{1,2}...c_{1,N}
c_{2,1}c_{2,2}...c_{2,N}
...
c_{N,1}c_{N,2}...c_{N,N}
- 第一行包含一个整数N,表示参赛的人数。
- 接下来的N行中,每行包含N个字符,第i行的第j个字符c_{i, j}表示队伍i和队伍j的比赛结果。
c_{i, j}的取值的意义如下:- 队伍i胜过队伍j时,值为
W
- 队伍i与队伍j打成平局时,值为
D
- 队伍i被队伍j打败时,值为
L
- i = j时,值为
-
- 队伍i胜过队伍j时,值为
- 接下来的N行中,第i行给出第i个需要合并的单词字符串w_i。
- 输入共N + 1行,在输入的最后,包含一个换行符。
输出格式
你需要输出优胜队伍的编号s、得分t、获胜场数W、平局场数D、失败场数L。
s t W D L
- 只需要输出1行。
- 在输出的最后,需要包含一个换行符。
条件
- 2 ≦ N ≦ 100
- 1 ≦ i ≦ N
- 1 ≦ j ≦ N
- c_{i, j}的取值只可能是
W
、D
、L
或-
四种 - c_{i, j}为
W
时,c_{j, i}为L
- c_{i, j}为
D
时,c_{j, i}为D
- i = j时,c_{i, j}为
-
- 优胜队伍只可能有1支(得分最大的队伍只可能有1支)
输入输出样例
输入输出样例1
输入:
3
-DW
D-D
LD-
输出:
1 3 1 1 0
输入输出样例2
输入:
10
-WLDWWDWWW
L-WDWWWLWW
WL-LWWLWWD
DDW-WWDWWW
LLLL-LLLWW
LLLLW-WLLL
DLWDWL-WLW
LWLLWWL-WW
LLLLLWWL-W
LLDLLWLLL-
输出:
4 15 6 3 0
题解
// Code by KSkun, 2019/5
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
typedef long long LL;
inline char fgc() {
static char buf[100000], *p1 = buf, *p2 = buf;
return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
? EOF : *p1++;
}
inline LL readint() {
LL res = 0, neg = 1; char c = fgc();
for(; !isdigit(c); c = fgc()) if(c == '-') neg = -1;
for(; isdigit(c); c = fgc()) res = res * 10 + c - '0';
return res * neg;
}
inline char readsingle() {
char c;
while(!isgraph(c = fgc())) {}
return c;
}
inline bool isop(char c) {
return c == '-' || c == 'D' || c == 'W' || c == 'L';
}
inline char readop() {
char c;
while(!isop(c = fgc())) {}
return c;
}
const int MAXN = 105;
int n, t[MAXN], w[MAXN], d[MAXN], l[MAXN];
int main() {
n = readint();
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
char op = readop();
if(i == j) continue;
if(op == 'W') {
w[i]++; t[i] += 2;
} else if(op == 'D') {
d[i]++; t[i] += 1;
} else if(op == 'L') {
l[i]++;
}
}
}
int win = 0;
for(int i = 1; i <= n; i++) {
if(t[i] > t[win]) win = i;
}
printf("%d %d %d %d %d", win, t[win], w[win], d[win], l[win]);
return 0;
}