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 对袋鼠都没有影响;而折线则没有这个问题。

  • 多折线有一个特点,就是当一侧的袋鼠合并到折线最上/最下处后,另一侧的袋鼠也会合并到折线最上/最下处,但是这两侧的袋鼠并不在一起,如果要继续合并,那还得再把折线走一遍,如下图例子。
    截图

    而虽然多折直线也有这个特点,但是直线每一轮走的路程并没有折线这么长,且同时还受到第一个因素的影响。相当于:多折线虽然单链的长度没有多直线那么长,但是我们比较的不是单链长度,而是在其中绕来绕去的长度,这个长度并不直观

posted @ 2022-10-26 11:06  hh2048  阅读(134)  评论(0编辑  收藏  举报