当前位置:网站首页>【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) ,时间复杂度平方级别。感觉是一个挺新奇的转移方式。
边栏推荐
- 一个接口并发问题的模拟与复现
- 2149. 按符号重排数组
- 鲲鹏devkit开发套件
- 暴力递归到动态规划 08(小马走象棋)
- 从一文中了解SSRF的各种绕过姿势及攻击思路
- DB2数据库-获取表结构异常:[jcc][t4][1065][12306][4.26.14]CharConvertionException ERRORCODE=-4220,SQLSTATE=null
- SAP 电商云 Spartacus UI 的持续集成 - Continous integration
- 软件测试从业多年,自认为技术不错,裸辞:一晃 ,失业3个月了~
- Greenplum database failure analysis, can not listen to the port
- 开源聚力,共创未来 | 麒麟信安祝贺openKylin首个体验版正式发布!
猜你喜欢
随机推荐
智能合约安全-可重入攻击(SW107-Reentrancy)
49. 字母异位词分组-排序法
MySQL删库不跑路
【软考 系统架构设计师】软件架构设计① 软件架构的概念
如何修复 SAP UI5 aggregation with cardinality 0..1 相关的错误消息
Greenplum database failure analysis, can not listen to the port
从一文中了解SSRF的各种绕过姿势及攻击思路
【Gopher 学个函数】边学边练,简单为 Go 上个分
做快乐的事情
【QT】自定义工程封装成DLL并如何调用(带ui界面的)
聊聊 Nacos
浅谈敏捷开发
阿南的对话
绿色版-SQL环境搭建
10. SAP ABAP OData 服务如何支持修改(Update)操作
JSP第一篇 -----JSP九大内置对象(隐式对象)和四大域对象
嵌入式开发:嵌入式基础——’ ’和” ”的区别
12-security退出.md
软件测试从业多年,自认为技术不错,裸辞:一晃 ,失业3个月了~
买了一瓶饮料










