当前位置:网站首页>【7.31】代码源 - 【矩阵操作】【宝箱】【New Stone Game】【等差数列】
【7.31】代码源 - 【矩阵操作】【宝箱】【New Stone Game】【等差数列】
2022-08-03 00:48:00 【ZhgDgE】
#804. 矩阵操作
题意:
思路:首先,判是否有解。如果操作行,那么这一行的差分不变。如果操作列,对应两列的差分变化相同。因此判断每一行的差分是否相同。
如有解,我们不妨先做完所有行操作,再做所有列操作(影响与先后顺序无关)。做完所有行操作后,必然是所有行都相同,且有一行是不会操作的(证明)。那我们 枚举 最终等于哪一行,先把其他行操作与这一行相同,再搞列操作。
证明:如果我们的解是对于每一行都有操作的,那我们把每行进行的操作转化为每列进行的操作(影响是相同的),那么一定可以构造出一组新的解,且存在一行没有行操作。
AC代码:http://oj.daimayuan.top/submission/311931
#806. 宝箱
题意: X X X 坐标轴上有 N ( 1 ≤ N ≤ 1 0 5 ) N(1\leq N\leq 10^5) N(1≤N≤105) 个钥匙和 N N N 个宝箱, 玩家初始位置为 x = 0 x=0 x=0 , 每一步可以走到 x + 1 x+1 x+1 或者 x − 1 x−1 x−1 .
同一个位置可以同时出现宝箱和钥匙, 但同一位置不会出现超过一个宝箱或超过一个钥匙.
当玩家到达一个有钥匙的位置时, 他可以将钥匙捡起. 当玩家到达一个有宝箱的位置时, 他可以选择使用一个钥匙将宝箱打开.
试求出玩家最少需要走多少步才能打开所有宝箱.
思路:贪心 / DP。容易知道,我们的路线一定是:向右走,拿到若干钥匙,回头开若干宝箱。重复上述若干次,然后径直走到最后,再回头停留在某宝箱处。
我们可以枚举最终落脚点,那么次数就是 2 × max ( a n , b n ) − a i + s i − 1 2\times \max(a_n,b_n) -a_i+s_{i-1} 2×max(an,bn)−ai+si−1 ,其中 s i s_i si 表示回头开启前 i i i 个宝箱要多走的路。我们要递推出来这个 s i s_i si 。
s i = s i − 1 + d t s_i=s_{i-1}+dt si=si−1+dt 。
当 a i ≥ b i a_i\geq b_i ai≥bi 时,不需要回头, d t = 0 dt=0 dt=0 。
当 a i < b i a_i < b_i ai<bi 时,我们有两种选择。1. 开完前 i − 1 i-1 i−1 个宝箱,然后拿 i i i 钥匙回去开 i i i 宝箱。 2. 拿到 i − 1 i-1 i−1 钥匙后顺带 i i i 钥匙,回去开 i , i − 1 ⋯ i,i-1\cdots i,i−1⋯ 宝箱。
我写的时候没有考虑到顺带的情况。还是要把所有情况考虑上。
AC代码:http://oj.daimayuan.top/submission/312073
#854. New Stone Game
题意:在3*3的格子上玩Nim游戏,特殊的地方是先后手第一次必须全部拿完。存在空行或者空列则无法操作,输。问先手初手有多少种选择是必胜态。
题解:(Nim游戏)代码源每日一题 Div1 New Stone Game
思路:
挖掘性质:
- 如果一个人操作前,该行或该列上存在 0 0 0 ,则操作此点为必输态。
- 最终的必输态一定是一个特殊点为 0 0 0 ,剩下的点(除特殊点和先后手初手点)为 1 1 1 的状态。
那么我们枚举先后手选择哪些格子,转化为 NIM 游戏。
思考普通博弈题时,通常从最终的必输态或必胜态开始研究,向上推结论。 比如这道题最终必输态就如 ∗ , 1 , 1 1 , 0 , 1 1 , 1 , ∗ \begin{matrix} * ,1,1\\ 1,0,1 \\ 1,1,* \end{matrix} ∗,1,11,0,11,1,∗ ,然后就是普通的 NIM 了。
AC代码:http://oj.daimayuan.top/submission/313001
#843. 等差数列
题意:给定一个大小为 n ( n ≤ 5000 ) n(n\leq 5000) n(n≤5000) 的集合 { S } \{S\} { S} , 你可以从中挑选若干个数组成等差数列, 求最长的等差数列长度。
思路:刚开始写了个 O ( n 2 × log n ) O(n^2\times \log n) O(n2×logn) 的 DP ,但是会 T 。
我们定义 d p ( i , j ) dp(i,j) dp(i,j) 表示后两项为 a i , a j ( i < j ) a_i,a_j(i<j) ai,aj(i<j) 的等差数列的最长长度。一个朴素的转移方式是,枚举 a k ( k < i ) a_k(k<i) ak(k<i) ,从 d p ( k , i ) dp(k,i) dp(k,i) 转移过来,然而这个转移是 O ( n ) O(n) O(n) 的,总为 O ( n 3 ) O(n^3) O(n3)
我们考虑怎么优化。我们可以先排一下序(答案与序列顺序无关),这样当我们固定 i i i ,枚举 j j j 时, k k k 也是有单调性的, j j j 向右则 k k k 向左。当 a k + a j = 2 × a i a_k+a_j=2\times a_i ak+aj=2×ai 时可以进行转移。那么做法就是枚举 i i i , j j j 向右滑动, k k k 向左滑动,从 d p ( k , i ) dp(k,i) dp(k,i) 转移到 d p ( i , j ) dp(i,j) dp(i,j) ,时间复杂度平方级别。感觉是一个挺新奇的转移方式。
边栏推荐
猜你喜欢
随机推荐
买了一瓶饮料
图文详细解决IDEA使用Debug模式启动项目一直转圈圈跑起不来(亲测可以)
麒麟信安邀您抢先看 | openEuler 志高远,开源汇智创未来-开放原子全球开源峰会欧拉分论坛最详细议程出炉
嵌入式开发:嵌入式基础——’ ’和” ”的区别
10大领域5大过程47子过程快速记忆
记一次sql优化Using temporary; Using filesort
GTK实现水波纹效果
Violent recursion to dynamic programming 06 (the sword refers to Offer II 095. Longest common subsequence)
如何修复 SAP UI5 aggregation with cardinality 0..1 相关的错误消息
全栈----跨域
精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
matlab常微分方程在传染病建模中的应用
软件测试从业多年,自认为技术不错,裸辞:一晃 ,失业3个月了~
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
【图像分类】2022-MPViT CVPR
【遥控器开发基础教程4】疯壳·开源编队无人机-SPI(OLED)
基于rt-thread studio的STM32裸机开发——LED
TensorFlow学习记录(一):基本介绍
如何让优炫数据库开机自启
JS做一个接近无限时长的滚动条