CF EDU 169

CF EDU 169

A

  • 题意:

    一条线上给定 n 个点,询问是否能新插入一个点,使得这个点是距离这 n 个点都是最近的

  • 题解:

    n > 2 n > 2 n>2 时,无解

    n = 2 n = 2 n=2 时,直接插入到这两个点中间即可

B

  • 题意:

    总共 n n n 个房间,第 i i i 个房间与第 i + 1 i+1 i+1 个房间中间有一扇门,假如 A A A 可能在 [ l , r ] [l, r] [l,r] 中任意一个房间, B B B 在 [ L , R ] [L, R] [L,R] 中任意一个房间,最少需要关闭几扇门才能保证两人不可能见面

  • 题解:

    如果两人所在区间不相交的话,关闭 1 扇门即可

    如果两人可能所在区间相交的话,相交区间的所有门必须关闭,最后判断一下边界即可

C

  • 题意:

    AliceBob 取数字,Alice 先手,Alice 取到的数字和为 ABob 取到的数字和为 BAlice 想最大化 A-BBob 想最小化 A-B,在游戏开始前 Bob 可以增大任意数字,但是总增加量不能超过 k,求 A-B 的最小值

  • 题解:

    每个人都尽量取剩下的最大的数字

    将数组排序,模拟取数字的过程,将最后结果减去 k 即可

    当有偶数个数字的时候,A-B 的最小值不会小于 0,奇数个数字的时候,A-B 的最小值不会小于原先所有数字的最小值

D

  • 题意:

    总共有四种颜色的门,每个城市会有两扇不同颜色的门,其中城市 ij 如果具有相同颜色的门,他们之间是互相可以到达的,所花费的价值是 ∣ i − j ∣ |i-j| ∣i−j∣,每次询问城市 x x x 去 y y y 所花费的最小花费是多少

  • 题解:

    若 x x x 和 y y y 具有相同颜色的门,最小花费就是 ∣ x − y ∣ |x-y| ∣x−y∣

    否则枚举所有与 x x x 和 y y y 不一样的情况,找到 x x x 右边第一个满足条件的门和 y y y 左边第一个满足条件的门,直接处理即可

  • code

E

  • 题意:

    取石子游戏,若一堆石子有 x 个,只能从中取出 y 个,其中 gcd(x, y) 必须等于 1。给定多堆石子,第 i 堆有 a i a_i ai 个石子,问先手和后手谁能赢

  • 题解:

    SG函数

    考虑处理出来每个 a i a_i ai 的 S G \rm SG SG 值。

    考虑 S G i \rm SG_i SGi,若 i i i 是质数,可以取任意 [ 1 , i − 1 ] [1, i-1] [1,i−1] 个石子,所以 S G i = m a x { S G j } + 1 SG_i=max\{SG_j\}+1 SGi=max{SGj}+1

    若 i i i 不是质数,对于 i i i 的最小质因数 p p p, p p p 的所有倍数都取不到,因此 S G i = S G p + 1 SG_i = SG_p + 1 SGi=SGp+1

    之后直接用 S G \rm SG SG 定理即可

F

  • 题意:

    给定一个数组 A,每次可以进行一下两种操作

    1. 用 A i + A i + 1 A_i+A_{i+1} Ai+Ai+1 替换 A i A_i Ai 和 A i + 1 A_{i+1} Ai+1
    2. 将 A i A_i Ai 拆成两个数字的和并替换掉 A i A_i Ai

    f ( A ) f(A) f(A) 表示让 A A A 数组变成回文数组的最小次数,求 ∑ 1 ≤ l ≤ r ≤ n ( A [ l : r ] ) \sum\limits_{1\le l \le r \le n}(A[l:r]) 1≤l≤r≤n∑(A[l:r])

  • 题解:

    对于一个长度为 n n n 的数组,最坏情况是用 n − 1 n-1 n−1 次操作将其变成回文

    但是对于某一个数组 A A A,取其一个前缀和一个后缀,若这两个子段和相等,可以减少一次操作

    令 f l , r f_{l, r} fl,r 表示 A [ l : r ] A[l:r] A[l:r] 的最少操作次数,考虑 dp,最优情况一定是:

    f l , r = min ⁡ { f L , R + ( L − l ) + ( r − R ) } f_{l,r}=\min\{f_{L,R}+(L-l)+(r-R)\} fl,r=min{fL,R+(L−l)+(r−R)}

    也就是 f l , r + l − r = min ⁡ { f L , R + L − R } f_{l,r}+l-r=\min\{f_{L,R}+L-R\} fl,r+l−r=min{fL,R+L−R}

    其中 ∑ i = L l A i = ∑ i = R r A i \sum\limits_{i=L}^l A_i = \sum\limits_{i=R}^r A_i i=L∑lAi=i=R∑rAi

    对 A A A 做前缀和 s u m sum sum,转移条件变为:

    s u m l − s u m L − 1 = s u m r − s u m R − 1 sum_l-sum_{L-1}=sum_r-sum_{R-1} suml−sumL−1=sumr−sumR−1,

    也就是 s u m r − s u m l = s u m R − 1 − s u m L − 1 sum_r-sum_l=sum_{R-1}-sum_{L-1} sumr−suml=sumR−1−sumL−1

    开一个桶 D D D,有 f l , r + l − r = D [ s u m r − s u m l ] f_{l,r}+l-r=D[sum_r-sum_l] fl,r+l−r=D[sumr−suml],每次转移完 f l , r f_{l,r} fl,r 后,更新 D [ s u m r − 1 − s u m l − 1 ] D[sum_{r-1}-sum_{l-1}] D[sumr−1−suml−1] 即可

  • code

G

  • 题意:

    给定一个又数字组成的字符串 s s s,可以将其划分乘偶数个非空子串 s i s_i si,会以一下规则构成新字符串 t t t:

    • 依次对于每个 j ≤ i 2 j\le \frac{i}{2} j≤2i,将 s 2 × j s_{2\times j} s2×j 个 s 2 × j − 1 s_{2\times j - 1} s2×j−1 拼接到 t t t 后面( s i s_i si 下标从 1 1 1 开始)

    给定 n n n 和 k k k,对于 s s s 中每个长度为 k k k 的字串,求出其以上述方法生成的 t t t 的最小长度

  • 题解:

    单独考虑一个字串 s s s,发现划分后所有的 s 2 × j − 1 s_{2\times j-1} s2×j−1 的长度一定为 1 1 1

    令 f i , j f_{i,j} fi,j 表示考虑到第 i i i 位,现在所填写的子串要重复 j j j 次,这种情况的最小长度,有

    f i , j = f i − 1 , j + j f_{i,j}=f_{i-1,j}+j fi,j=fi−1,j+j

    f i , s i − 1 = min ⁡ { f i , s i − 1 , f i − 2 , k + s i − 1 } f_{i, s_{i-1}} = \min\{f_{i,s_{i-1}},f_{i-2,k}+s_{i-1}\} fi,si−1=min{fi,si−1,fi−2,k+si−1}

    考虑广义矩阵乘法,令 f i , 10 f_{i,10} fi,10 表示考虑到第 i i i 位,并且要更新 j j j 的值(也就是上面转移的第二种情况)

    因为要求多个子数组的答案,直接双指针就行

  • code

相关推荐
Joeysoda6 分钟前
Java数据结构 时间复杂度和空间复杂度
java·开发语言·jvm·数据结构·学习·算法
拓端研究室TRL15 分钟前
TensorFlow深度学习框架改进K-means聚类、SOM自组织映射算法及上海招生政策影响分析研究...
深度学习·算法·tensorflow·kmeans·聚类
月临水25 分钟前
算法:双指针题目练习
算法
大二转专业1 小时前
408算法题leetcode--第七天
考研·算法·leetcode
大母猴啃编程1 小时前
数据结构---非线性--树
c语言·数据结构·学习·算法·青少年编程
让学习成为一种生活方式1 小时前
解析药用植物重楼甾体皂苷生物合成中的连续糖基化及其抗真菌作用-文献精读49
linux·数据库·算法·天然产物化学
super晓权1 小时前
SVM原理
算法·svm·machine learning
i嗑盐の小F2 小时前
【IEEE出版,高录用 | EI快检索】第二届人工智能与自动化控制国际学术会议(AIAC 2024,10月25-27)
图像处理·人工智能·深度学习·算法·自然语言处理·自动化
Python之栈2 小时前
Python if 语句优化技巧
python·算法
冰红茶兑滴水2 小时前
Linux 线程控制
linux·c++·算法