作者: KSkun

[工程师死绝的世界C3003]学べない学校 翻译及题解

[工程师死绝的世界C3003]学べない学校 翻译及题解

没有学生的学校

Translation by KSkun

原题:問題「学べない学校」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜

问题描述

学校里的孩子们在玩剪刀石头布。特别是A君和B君,每天都要来上几盘,两人争来争去非要比个高下。
你知道了两个人的游戏记录,他们想让你写一个程序来判定他们谁最强。
A君和B君一共进行了N次游戏。
你知道了他们进行的游戏次数N以及每一次的状况,你需要写一个统计A君和B君获胜次数的程序。

剪刀石头布有三种手势:剪刀、石头、步。
石头可以赢剪刀,剪刀赢布,布赢石头。

输入中:

  • 石头用g表示
  • 剪刀用c表示
  • 布用p表示

样例1的说明如下图所示。

botchi c 3003 img - [工程师死绝的世界C3003]学べない学校 翻译及题解

输入格式

N 
a_1 b_1 
a_2 b_2 
... 
a_N b_N
  • 第一行包含一个整数N,表示A君和B君游戏的次数。
  • 接下来的N行,每行包含两个用半角空格分开的字符a_i和b_i,分别代表A君和B君的出法(字符对应出法参见问题描述)。
  • 输入共N + 1行,在输入的最后,包含一个换行符。

输出格式

以以下的格式分别输出A君和B君获胜的次数。

w_a 
w_b
  • 输出应该包含2行。
  • 第一行输出一个整数w_a,表示A君获胜的次数。
  • 第二行输出一个整数w_b,表示B君获胜的次数。
  • 输出的最后应该包含一个换行符。

条件

  • 1 ≦ N ≦ 1000
  • a_i和b_i只可能是gcp中的一种。

输入输出样例

输入输出样例1

输入:

3 
g g 
c p 
p g

输出:

2 
0

输入输出样例2

输入:

10 
p g 
c c 
p p 
g g 
c p 
c p 
g g 
p p 
g p 
p g

输出:

4 
1

题解

// Code by KSkun, 2019/1
#include <cstdio>
#include <cctype>

#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 int win(char a, char b) {
    if(a == b) return 0;
    if(a == 'g' && b == 'c') return 1;
    if(a == 'c' && b == 'p') return 1;
    if(a == 'p' && b == 'g') return 1;
    return -1;
}

int n, cnta = 0, cntb = 0;
char wa[5], wb[5];

int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%s%s", wa, wb);
        int res = win(wa[0], wb[0]);
        if(res > 0) cnta++;
        else if(res < 0) cntb++;
    }
    printf("%d\n%d\n", cnta, cntb);
    return 0;
}
[工程师死绝的世界B2003]隔離された街のゲート 翻译及题解

[工程师死绝的世界B2003]隔離された街のゲート 翻译及题解

被隔离的街道的大门

Translation by KSkun

原题:問題「隔離された街のゲート」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜

问题描述

你找到了一个未完成的游戏程序,这个游戏没有实现控制角色移动的方法。

这个未完成的游戏使用宽为 W 高为 H 的网格图作为地图。
左下角的点是原点,坐标是 (0, 0) 。
从原点横向前进 x 单位,纵向前进 y 单位到达的点坐标表示为 (x, y) 。

现在由于处于开发阶段,地图上没有障碍物,角色的初始坐标为 (0, 0) 。
从该状态开始,执行总共 N 个的向上、下、左或右的移动操作。
各个移动操作对角色坐标 (x, y) 的更改情况如下所示:

  • 向上移动:将角色的坐标从 (x, y) 变为 (x, y + 1) 。
  • 向下移动:将角色的坐标从 (x, y) 变为 (x, y – 1) 。
  • 向左移动:将角色的坐标从 (x, y) 变为 (x – 1, y) 。
  • 向右移动:将角色的坐标从 (x, y) 变为 (x + 1, y) 。

在开发需求文档中,需要编写一个能够判断角色在 N 次移动操作的过程中是否处于不合法的坐标上。
这里的不合法的坐标指的是在地图之外的坐标,也就是地图上不存在的坐标。
例如,输入输出样例1和2可以表示如下。

botchi b 2003 img1 - [工程师死绝的世界B2003]隔離された街のゲート 翻译及题解

botchi b 2003 img2 - [工程师死绝的世界B2003]隔離された街のゲート 翻译及题解

输入格式

H W N 
d_1 
... 
d_N
  • 第一行包含三个整数,分别是地图的高 H 、宽 W 和移动操作的次数 N ,数值之间用一个半角空格分隔。
  • 接下来的 N 行,第 i (1 ≦ i ≦ N) 行包含一个字符,代表第 i 次移动操作的方向。”U“代表向上,”D“代表向下,”L“代表向左,”R“代表向右。
  • 输入数据一共包含 N + 1 行,输入的的末尾包含一个空行。

输出格式

在 N 次移动操作中,如果角色到达了不合法的坐标,则输出一行“invalid”,否则输出一行“valid”。

条件

  • 1 ≦ H, W ≦ 50
  • 1 ≦ N ≦ 500
  • 对于任意 i (1 ≦ i ≦ N) , d_i 的值为大写英文字母”U”、”D”、”L”、”R”中的一个。

输入输出样例

输入输出样例1

输入:

3 3 5 
U 
R 
D 
R 
L

输出:

valid

输入输出样例2

输入:

4 4 7 
U 
U 
R 
R 
R 
R 
D

输出:

invalid

题解

// 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 == 'U' || c == 'D' || c == 'R' || c == 'L';
}

inline char readop() {
    char c;
    while(!isop(c = fgc())) {}
    return c;
}

int n, m, N;

int main() {
    n = readint(); m = readint(); N = readint();
    int nx = 0, ny = 0;
    while(N--) {
        char op = readop();
        if(op == 'U') ny++;
        else if(op == 'D') ny--;
        else if(op == 'L') nx--;
        else if(op == 'R') nx++;
        if(nx < 0 || nx >= n || ny < 0 || ny >= m) {
            puts("invalid"); 
            return 0;
        }
    }
    puts("valid");
    return 0;
}
[工程师死绝的世界A1001]有名なプールサイド 翻译

[工程师死绝的世界A1001]有名なプールサイド 翻译

著名的水边

Translation by KSkun

原题:問題「有名なプールサイド」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜

问题描述

这次你负责设计一个新的城镇。
这个城镇的南北长 H ,东西宽 W ,一共由 H × W 个区域构成。
此外,所有的区域都被分配了一个坐标,如下图所示。

botchi a 1001 fig1 - [工程师死绝的世界A1001]有名なプールサイド 翻译

给定一个计划在城镇中建造的建筑物的列表。
每一座建筑物覆盖的区域都是矩形的,且只有一个门。

botchi a 1001 fig2 - [工程师死绝的世界A1001]有名なプールサイド 翻译

由于列表中包含了很多建筑物,可能无法建造出列表中所有的建筑物。
所以,你需要决定在城镇中建造哪些建筑物。

在决定建造哪些建筑物的时候,需要遵循以下 3 条规则。

  1. 建造的建筑物中,任意 2 座不能重叠。
  2. 建筑物的方向必须是表中给定的方向(建筑物不可旋转)。
  3. 可以通过“没有建筑物的区域”在任意 2 座建筑物的门之间移动。

这 3 条规则的形式化描述如下:
对于任意的 2 座建筑物,设它们的门的坐标分别为 P, Q 。
存在满足以下条件 (i)-(iii) 的一组坐标 (r_1, c_1), (r_2, c_2), …, (r_m, c_m) (m 是正整数) 。

  • (i) 满足 1 ≦ r_i ≦ H, 1 ≦ c_i ≦ W (1 ≦ i ≦ m) 。
  • (ii) 在坐标 (r_i, c_i) 处没有建造建筑物。
  • (iii) 假设 P = (r_0, c_0), Q = (r_{m+1}, c_{m+1}) ,坐标 (r_i, c_i) 与 (r_{i+1}, c_{i+1}) 是相邻的坐标(即代表的区域共有上下左右边界之一) (0 ≦ i ≦ m) 。

下面的图片中展示了遵循条件 (i)-(iii) 的例子与不遵循它们的例子。
对于灰色与绿色建筑,你可以通过“没有建筑物的区域”在它们的门之间移动。
另一方面,对于灰色和蓝色建筑,不存在这样的移动方式。

botchi a 1001 fig3 - [工程师死绝的世界A1001]有名なプールサイド 翻译

一个覆盖了 X 个区域的建筑物会产生 X 万日元的利润。
请你编写一个程序,来计算使产生利润之和最大的建造建筑物的方案。

至少建造 1 座能产生利润的建筑物就判定为正确答案,得分根据产生利润之和的数值计算。

输入格式

H W N 
h_1 w_1 r_1 c_1 
h_2 w_2 r_2 c_2 
... 
h_N w_N r_N c_N
  • 第一行包含三个整数,分别是表示城镇区域大小的 H, W 与表示建筑物列表中建筑物的数量 N ,数值之间用一个半角空格隔开。
  • 接下来的 N 行中,第 i (1 ≦ i ≦ N) 行包含表示列表中第 i 座建筑物的信息的 4 个整数 h_i, w_i, r_i, c_i ,依次用一个半角空格隔开。
    • h_i, w_i 分别表示第 i 座建筑物的南北长度与东西宽度。
    • r_i, c_i 表示第 i 座建筑物的门的相对位置。门的位置为相对建筑物来说坐标 (r_i, c_i) 代表的区域,如下图所示。门在建筑物的外侧,且保证不在建筑物的四角上。
      botchi a 1001 fig4 - [工程师死绝的世界A1001]有名なプールサイド 翻译
  • 输入数据总共 N + 1 行,在最后一行之后有一个空行。

输出格式

请按以下格式输出建筑物的建造方案。

a_{1,1} a_{1,2} ... a_{1,W} 
a_{2,1} a_{2,2} ... a_{2,W} 
... 
a_{H,1} a_{H,2} ... a_{H,W}
  • 输出应当包含 H 行。
  • 第 i (1 ≦ i ≦ H) 行中包含 W 个整数 a_{i,1}, a_{i,2}, …, a_{i,W} ,数字间用一个半角空格隔开。
  • a_{i,j} 代表在坐标 (i, j) 处建造的建筑物的编号,如果此处没有建筑物则该值为 0 。此处建筑物的编号指建筑物列表中的建筑按照输入顺序的 1 到 N 的编号。
  • 在输出的最后应包含一个空行,除此之外不应包含任何其他的字符或空行。

条件

  • 2 ≦ H, W ≦ 100
  • 1 ≦ N ≦ 100
  • 对于任意的 1 ≦ i ≦ N
    • 2 ≦ h_i ≦ H
    • 2 ≦ w_i ≦ W
    • 1 ≦ r_i ≦ h_i
    • 1 ≦ c_i ≦ w_i
    • 坐标 (r_i, c_i) 在建筑物的外侧(即至少满足 r_i = 1 、 r_i = h_i 、 c_i = 1 、 c_i = w_i 之中的一个条件)
    • 坐标 (r_i, c_i) 不在建筑物的四角(即 (r_i, c_i) 不可能是 (1, 1), (1, w_i), (h_i, 1), (h_i, w_i) 中的任意一个)
    • 保证能够建造的建筑物至少有 1 座。

输入输出样例

输入输出样例1

输入:

5 5 2 
2 5 2 2 
2 5 1 3

输出:

1 1 1 1 1 
1 1 1 1 1 
0 0 0 0 0 
2 2 2 2 2 
2 2 2 2 2

输入输出样例2

输入:

5 7 4 
3 5 1 3 
3 5 3 3 
3 5 2 1 
3 5 2 5

输出:

0 0 0 0 0 0 0 
0 1 1 1 1 1 0 
0 1 1 1 1 1 0 
0 1 1 1 1 1 0 
0 0 0 0 0 0 0

题解

本题没能找到什么思路……
求会写的dalao带带我QAQ