[CF1C]Ancient Berland Circus 题解
题目地址:Codef …
May all the beauty be blessed.
Translation by KSkun
原题:問題「学べない学校」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜
学校里的孩子们在玩剪刀石头布。特别是A君和B君,每天都要来上几盘,两人争来争去非要比个高下。
你知道了两个人的游戏记录,他们想让你写一个程序来判定他们谁最强。
A君和B君一共进行了N次游戏。
你知道了他们进行的游戏次数N以及每一次的状况,你需要写一个统计A君和B君获胜次数的程序。
剪刀石头布有三种手势:剪刀、石头、步。
石头可以赢剪刀,剪刀赢布,布赢石头。
输入中:
g
表示c
表示p
表示样例1的说明如下图所示。
N
a_1 b_1
a_2 b_2
...
a_N b_N
以以下的格式分别输出A君和B君获胜的次数。
w_a
w_b
g
、c
和p
中的一种。输入:
3
g g
c p
p g
输出:
2
0
输入:
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;
}
Translation by KSkun
原题:問題「隔離された街のゲート」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜
你找到了一个未完成的游戏程序,这个游戏没有实现控制角色移动的方法。
这个未完成的游戏使用宽为 W 高为 H 的网格图作为地图。
左下角的点是原点,坐标是 (0, 0) 。
从原点横向前进 x 单位,纵向前进 y 单位到达的点坐标表示为 (x, y) 。
现在由于处于开发阶段,地图上没有障碍物,角色的初始坐标为 (0, 0) 。
从该状态开始,执行总共 N 个的向上、下、左或右的移动操作。
各个移动操作对角色坐标 (x, y) 的更改情况如下所示:
在开发需求文档中,需要编写一个能够判断角色在 N 次移动操作的过程中是否处于不合法的坐标上。
这里的不合法的坐标指的是在地图之外的坐标,也就是地图上不存在的坐标。
例如,输入输出样例1和2可以表示如下。
H W N
d_1
...
d_N
在 N 次移动操作中,如果角色到达了不合法的坐标,则输出一行“invalid”,否则输出一行“valid”。
输入:
3 3 5
U
R
D
R
L
输出:
valid
输入:
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;
}
Translation by KSkun
原题:問題「有名なプールサイド」 | エンジニアが死滅シタ世界 〜アンドロイドとふたりぼっちで生きろ〜
这次你负责设计一个新的城镇。
这个城镇的南北长 H ,东西宽 W ,一共由 H × W 个区域构成。
此外,所有的区域都被分配了一个坐标,如下图所示。
给定一个计划在城镇中建造的建筑物的列表。
每一座建筑物覆盖的区域都是矩形的,且只有一个门。
由于列表中包含了很多建筑物,可能无法建造出列表中所有的建筑物。
所以,你需要决定在城镇中建造哪些建筑物。
在决定建造哪些建筑物的时候,需要遵循以下 3 条规则。
这 3 条规则的形式化描述如下:
对于任意的 2 座建筑物,设它们的门的坐标分别为 P, Q 。
存在满足以下条件 (i)-(iii) 的一组坐标 (r_1, c_1), (r_2, c_2), …, (r_m, c_m) (m 是正整数) 。
下面的图片中展示了遵循条件 (i)-(iii) 的例子与不遵循它们的例子。
对于灰色与绿色建筑,你可以通过“没有建筑物的区域”在它们的门之间移动。
另一方面,对于灰色和蓝色建筑,不存在这样的移动方式。
一个覆盖了 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
请按以下格式输出建筑物的建造方案。
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}
输入:
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
输入:
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