月度归档: 2019 年 5 月

[工程师死绝的世界C3002]機械の総合病院 翻译及题解

[工程师死绝的世界C3002]機械の総合病院 翻译及题解

机械综合医院

Translation by KSkun

原题:問題「機械の総合病院」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜

问题描述

你在分析PAIZA医院的系统。
为了避免被非法入侵,医院系统的用户密码应该达到一定的强度。
PAIZA医院的系统要求用户密码满足以下的强度要求:

  • 长度不低于6
  • 必须包含英文字母和数字
  • 同一字符不得连续出现3次或以上

密码中,不区分英文字符的大小写。
如果密码满足以上强度要求,输出Valid,否则输出Invalid

例如,样例1中的密码7Caaad9满足条件1和2,但是不满足条件3,因为aaa这里连续出现了3个a字符。

输入格式

t
  • 给出表示密码的字符串t。
  • 在输入的最后,包含一个换行符。

输出格式

如果密码满足以上强度要求,输出Valid,否则输出Invalid

条件

  • 1 ≦ t的长度 ≦ 30
  • 字符串t只包含半角英文字符及半角数字

输入输出样例

输入输出样例1

输入:

7Caaad9

输出:

Invalid

输入输出样例2

输入:

DjZGrduN8Mj4

输出:

Valid

题解

// Code by KSkun, 2019/1
#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;
}

char t[35];
bool hasalpha = false, hasdigit = false;

int main() {
    scanf("%s", t + 1);
    int n = strlen(t + 1);
    if(n < 6) {
        puts("Invalid"); return 0;
    }
    int cnt = 0;
    for(int i = 1; i <= n; i++) {
        if(isupper(t[i])) t[i] = tolower(t[i]);
        if(isalpha(t[i])) hasalpha = true;
        if(isdigit(t[i])) hasdigit = true;
        if(t[i] != t[i - 1]) cnt = 1;
        else cnt++;
        if(cnt >= 3) {
            puts("Invalid"); return 0;
        }
    }
    if(!hasalpha || !hasdigit) {
        puts("Invalid"); return 0;
    }
    puts("Valid");
    return 0;
}
[工程师死绝的世界B2002]砂漠の公園 翻译及题解

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

沙漠公园

Translation by KSkun

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

问题描述

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

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

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

样例1解释如下图所示。

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

输入格式

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;
}
[工程师死绝的世界D5005]お金が引き出せない銀行 翻译及题解

[工程师死绝的世界D5005]お金が引き出せない銀行 翻译及题解

取不出钱的银行

Translation by KSkun

原题:問題「お金が引き出せない銀行」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜

问题描述

你正在编写一个用于从银行存款中取钱的程序。
你知道你的存款n以及要取的钱数w。
取钱时,如果取钱后的余额为负值,则输出error,否则输出余额。

输入格式

n 
w
  • 第一行包含一个数字n,表示银行存款。
  • 第二行包含一个数字w,表示要取的钱数。
  • 在输入的最后,包含一个换行符。

输出格式

如果取钱后的余额为负值,则输出error,否则输出余额。

条件

  • 0 ≦ n ≦ 100,000
  • 0 ≦ w ≦ 100,000
  • n, w都是非负整数

输入输出样例

输入输出样例1

输入:

10000 
1020

输出:

8980

输入输出样例2

输入:

1000 
5000

输出:

error

题解

// Code by KSkun, 2019/1
#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;
}

int n, w;

int main() {
    scanf("%d%d", &n, &w);
    if(w > n) puts("error");
    else printf("%d\n", n - w);
    return 0;
}