2017 ACM Arabella Collegiate Programming Contest

两道编程题解析
本文解析了两道编程竞赛题目,一是通过奇偶分析和前缀和解决的Sherlock Bones问题,二是运用博弈论和构造策略解答的Competitive Seagulls问题。

Gym101350A. Sherlock Bones

题目大意: 给定一个长度为 \(n\)\(01\) 序列 \(\{s_n\}\),定义 \(F(i, j)\) 表示序列第 \(i\) 项到第 \(j\) 项之间 \(1\) 的个数。求有多少个三元组 \((i, j, k)\) 满足 \(i < j < k\)\(F(i, j) = F(j, k)\)\(s_j = 1\)

数据范围: \(3 \leq n \leq 2 \times 10^5\)

简要题解: 注意到对于一个合法的三元组 \((i, j, k)\),则 \(F(i, k) = 2F(i, j) - 1\) 必为奇数。而对于任意的 \(F(i, k)\) 为奇数,其对应的 \(j\) 所在的位置是唯一的。这意味着我们只要统计有多少二元组 \((i, k)\) 满足 \(F(i, k)\) 为奇数即可,用前缀和可以方便地统计。

时空复杂度: \(O(n) - O(n)\)

关键字: 奇偶分析,前缀和

Gym101350E. Competitive Seagulls

题目大意: \(n\) 只海鸥排成一排,设当前最长连续海鸥段的长度为 \(L\),令 \(P\) 为质数且 \(P \leq \lceil \dfrac{L}{2} \rceil\),若不存在满足条件的质数,那么 \(P\)\(1\)。现在有两个人轮流取走海鸥,每次可以取走连续的 \(P\) 只,其中 \(P\) 满足上述条件,无法再取走海鸥的人输。问先手是否有必胜策略。

数据范围: \(1 \leq n \leq 10^7\)

简要题解:\(n = 2, 3\) 时,显然先手必败。当 \(n \geq 4\) 时,若 \(n\) 为偶数,那么先手先取走最中间两只海鸥,则所有的海鸥恰好被分割成左右对称的两段,此时,后手如何取,先手只要对称地取即可,故先手有必胜策略,若 \(n\) 为奇数,则先手先取走最中间的三只海鸥,其余同上。

时空复杂度: \(O(1) - O(1)\)

关键字: 博弈,构造

转载于:https://www.cnblogs.com/lijingze8/p/7207400.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值