2020 ICPC 南京
比赛相关信息
比赛信息
比赛名称: 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京)
比赛地址: 牛客补题全部参赛队伍: 545有效队
金: Rk 35,6题,738m
银: Rk 105,4题,397m
铜: Rk 210,4题,827m其他参考:
6题尾: Rk 46
5题尾: Rk 88
4题尾: Rk 219
以上数据参考自官方获奖名单,可能与公共榜单有所差别。
比赛过程回顾
A | B | C | D | E | F | |
---|---|---|---|---|---|---|
提交次数 | 4 | 0 | 0 | 0 | 2 | 0 |
首次提交时间 | 0:15:31 | 1:09:02 | ||||
首A时间 | 1:09:02 | |||||
最终通过数 | 6/4854 | 0/12 | 1/29 | 7/74 | 324/2375 | 242/1376 |
状态 | ⚪ | ✔ | ||||
知识点 |
G | H | I | J | K | L | M | |
---|---|---|---|---|---|---|---|
提交次数 | 0 | 0 | 0 | 0 | 1 | 1 | |
首次提交时间 | 0:19:05 | 0:44:55 | |||||
首A时间 | 0:19:05 | 0:44:55 | |||||
最终通过数 | 2/19 | 61/158 | 1/12 | 14/101 | 546/836 | 483/1462 | 73/315 |
状态 | ✔ | ✔ | |||||
知识点 | 模拟+暴力 |
共 3 题,170m,Rk 225(三题榜首)。
✔:比赛时通过;⚪:比赛时尝试过;补:已补题。
个人小评
打了大概三个多小时,前半程速度其实还算可以,但是后面就直接卡题了。中期解题水平还是有很大欠缺。
部分题目回顾
A - Ah, It's Yesterday Once More
小评
这题赛时是我去开的,开题非常早,也感觉很好做,但是看通过率就犹豫了,中期无题可开的时候突然想到了以前看过的类似的题,但显然不是这么好过的,莽了几发后遗憾退场……
题意
有一道题如下:
在一张 \(20*20\) 的地图上有障碍物和空地,保证空地不构成环。现在,每一块空地上都有一只袋鼠,你可以发出
UDLR
的指令,命令所有的袋鼠向某个方向移动一格,你需要构造不长于 \(5*10^4\) 的指令条,使得全部的袋鼠汇聚于同一块空地。
给出如下的纯随机算法,你需要制造一组样例,使得这个算法的成功率低于 $25% $ 。
#include <bits/stdc++.h>
using namespace std;
int main(){
srand(time(NULL));
string s = "UDLR";
for (int i = 1; i <= 50000; i++) putchar(s[rand() % 4]);
return 0;
}
思路
赛时思路(错误)
我们还是从比较简单的思路出发想这道题,首先,一定要构造出一条尽可能长的由空地组成的链,那么现在的问题是尽可能多的构造折线还是尽可能的塞满。
在赛时我并没能区分这两者,只是按照以前看到过的思路构造了一个,如下图:
这个构造中一共有 \(249\) 个 \(1\) ,但是很遗憾没能通过,后来发现本题是允许岔路的,而不是单纯的一条链,于是对上图稍作改进后得到如下图:
这个构造的 \(1\) 的数量达到了 \(263\) 个,然而很遗憾,还是没能通过。至此,我们的思路转变为“尽可能多的出现岔路”,由队友 \(\mathcal Hamine\) 构造出了如下图:
这个构造中的 \(1\) 的数量达到了恐怖的 \(273\) 个,但是仍然失败。
正解
正解需要满足的条件如下:
- 尽可能多的出现折线,少出现直线;
- 尽可能多的用一条链填满图形,而不是岔路。
这里给出四个正解:
虽然我没能理解其中的具体原理,但是我可以就我这两天的思考做一个小小的猜测。
-
首先,直线上的袋鼠更加容易合并到一起,假设直线是上下走的,那么
LR
对袋鼠都没有影响;而折线则没有这个问题。 -
多折线有一个特点,就是当一侧的袋鼠合并到折线最上/最下处后,另一侧的袋鼠也会合并到折线最上/最下处,但是这两侧的袋鼠并不在一起,如果要继续合并,那还得再把折线走一遍,如下图例子。
而虽然多折直线也有这个特点,但是直线每一轮走的路程并没有折线这么长,且同时还受到第一个因素的影响。相当于:多折线虽然单链的长度没有多直线那么长,但是我们比较的不是单链长度,而是在其中绕来绕去的长度,这个长度并不直观。