2023年上海市大学生程序设计竞赛-四月赛
2023年上海市大学生程序设计竞赛-四月赛
A. 宝石划分
题目大意
海盗们获得了$n$颗相同的宝石(宝石无法切割)
船上共$m$个海盗,他们希望能够完美地瓜分这些宝石,即每个人获得的宝石数量相同,但是目前可能无法完美地瓜分
他们商量:如果在座的各位无法完美地瓜分这些宝石,就随机把一个人扔下船,直到可以让每个海盗分到的宝石一样多为止
求最终每个海盗获得的宝石数量
解题思路
如果$n\leq m$,肯定是扔到人和宝石一样多,答案为$1$
否则,要扔到$n$的所有约数中最靠近$m$且小于等于$m$的那一个约数
具体代码
1 |
|
B. CHAO!OP!
题目大意
济云星这个星球上的语言是摩斯电码,对应$26$个大写字母
现在有一篇文章
已知文章是人写的,也是给人看的,那么它就不应该出现$OP$
现在将这篇文章的摩斯电码给你,请你算一算,这段电码有多少种划分方案,使得最后的文章不存在子串$OP$
请输出划分的方案数,对$10^9+7$取模
字符串中$1$代表$-$,$0$代表$\cdot$
解题思路
计数$dp$
考虑对状态进行划分,最后一个划分出的字符是否是$O$
$dp[n][0/1]$表示对于前$n$位,最后一个字符不是$/$是$O$的合法方案有多少种
转移式子很简单
具体代码
1 |
|
C. dataHacker
题目大意
你是一名黑客,你的目标是破解一个神秘组织的数据库
你不能直接访问他们的数据,因为他们使用了一种特殊的加密算法
你只能询问指定两个位置的校验码,也就是得到两个不同位置的数据块的按位与运算的结果
总共$n$个数据块,每个数据块由$[0,1023]$范围内的整数构成
你需要在有限的$2\times n+220$次询问(包括回答)内,还原出他们的所有数据块
下面是交互流程
首先输入一个整数$n$
你的程序有两种输出询问的方式
第一种:
$0\ p1\ p2$
询问$p1,p2$两个位置的“与”的结果
其中$p1,p2$是编号从$0$开始的两个不同的位置
$p1\neq p2$并且$0\leq p1,p2\leq n-1$
第二种:
$1\ a0\ a1\ a2\cdots$
$1$后面连续$n$个整数,代表数组内容
如果数组内容正确,结果会返回AC
数组保证随机生成
解题思路
每个元素的值是所有和其有关的询问的结果的”或”
因为数据是随机生成,大概率有两个值的”或”结果是全$1$
利用$220$次询问找到这样的两个值
然后用剩下$2n$次询问去确定剩下的值
具体代码
1 |
|
D. 单词游戏
题目大意
给定$n$个字符串
现在要选至少一个字符串(可以重复选择同一个字符串)来拼接形成回文串
选择每个字符串$s_i$都有对应的代价$c_i$
问构造出回文串的最小代价
解题思路
考虑最后构造出的回文串长什么样子
如果由单一串构成,那很简单
如果由多个不同串构成,那么选定第一个串,其实最后一个串的选择并不多
并且选了一个可能的最后一个串后,可以发现问题变成了一个子问题,要么已经回文,要么还是有一个串的部分没有匹配
考虑状态$dis[i][0/1][j]$表示未能完全匹配的串为第$i$个串,$0/1$表示前$/$后缀,长度为$j$,此时最小的$cost$为多少
然后跑最短路
结点数只有$100\times 2\times 60=12000$个
和蓝书上的《装满的油箱》有点像
具体代码
1 |
|
E. 画画的贝贝
题目大意
给定一面颜色初始为$1$的长度为$n$的墙
进行$m$次操作
每次操作将$[l,r]$区间内的墙涂成颜色$c$(会覆盖原有颜色)
在每次操作后,输出当前整面墙壁上的颜色种类总数
解题思路
珂朵莉树
数据没有保证随机,复杂度有点玄学
具体代码
1 |
|