NOIP20240731
NOIP20240731
T1 数据库
- 题意:给定一个字符串
S
作为用户名,检查它是否已存在于数据库(集合)中。如果S
不存在,则返回OK
并将S
加入数据库。如果S
已存在,则在S
后面添加最小的正整数,然后加入数据库,并返回该新用户名。 - 题解:简单的
map
练习题。 - 代码
T2 社会服务
- 题意:有两边各 \(n\) 个潘奕帆要过马路并返回原地,搀扶一个潘奕帆过马路和你单独穿越马路的时间为 \(t\),潘奕帆休息的时间为 \(x\)。你一次只能扶一个潘奕帆,问所有潘奕帆过马路并返回的最短时间。
- 题解:首先扶潘奕帆过第一波马路的时间是 \(2nt\),接下来考虑你留在哪边扶第二波马路。留在这边的开始时间是 \(\min(2nt,2t+x)\),去那边的开始时间是 \(\min(2nt+t,t+x)\),考虑最小的第二波时间即可,第二波时间开始之后可以连续扶过马路。
- 代码
T3 完美匹配
- 题意:自己看
- 题解:\(n\) 为奇数答案为 \(0\)。
把两个点绑一块,共有 \(n!!=1\times 3\times \dots \times (n-1)\) 种方法。
绑一块的点能组成的树,有 \((\cfrac{n}{2})^{\cfrac{n}{2}-2}\) 种。
点与点之间相互连接,有 \(4^{\cfrac{n}{2}-1}\) 种。
将方案乘起来即可。 - 代码
T4 合并石子
-
题意:给定一个由正整数组成的序列 \(a_1, a_2, \dots, a_n\),你可以进行若干次操作,每次操作你可以选择一个位置 \(i\)(\(2 \leq i \leq n-1\)),如果满足 \(a_i = \cfrac{a_{i-1} + a_{i+1}}{2}\),则可以删除 \(a_i\)。删除后,后面的数字依次前移,序列长度减少 \(1\)。问经过若干次操作后,序列的最小长度是多少?
-
题解:差分之后,变成每次选择两个相邻的相同的值 \(a_x,a_y\),把他们合并成 \(a_x+a_y\)。
注意到 \(a_i\div \text{lowbit}(a_i)\) 不同的数一定不能合并,按这个东西分段,分段之后考虑怎样合并。
对于每一个点 \(i\),设 \(f_{i,j}\) 表示以 \(i\) 为右端点合并到 \(\text{lowbit}\) 为 \(2^j\)的左端点需要是多少,这个可以倍增预处理出来。
剩下的对于每一段做dp
,设 \(G_i\) 为最小长度,则对于每一个 \(j\) 都有 \(G_i=min(G_i,G_{f_{i,j}}+1)\)。