[工程师死绝的世界B2002]砂漠の公園 翻译及题解

[工程师死绝的世界B2002]砂漠の公園 翻译及题解

沙漠公园

Translation by KSkun

原题:問題「砂漠の公園」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜

问题描述

以前公园经常举行某种比赛的大会。每次比赛的结果记录都能找到,但是哪只队伍最终获得优胜的记录却丢失了。
因此你需要写一个程序来计算最终是哪只队伍获得了优胜。

大会进行循环比赛,按照以下的方式计算每只队伍的得分。一次比赛获胜得2分,平局得1分,输局得0分。
在所有比赛进行完毕后,得分最多的队伍获得优胜。

输入中包含大会的参赛人数以及比赛结果,请设计程序输出比赛的获胜者以及得分和胜利、平局、失败的场数。

样例1解释如下图所示。

img

输入格式

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时,值为-
  • 接下来的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}的取值只可能是WDL-四种
  • 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;
}


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据