【题解】NOIP 2020 移球游戏 / 微信步数
对比后可以发现 t4 部分分好拿,但是最后 \(20\) 分代码很复杂,考场上不太能搞。t3 的部分分给的没有 t4 猛,但是 t3 题目难度整体小于 t4,基本属于套路分治。
T3
首先考虑 \(n=2\) :考虑先将所有的柱子整理为黑上白下,然后最后通过空柱子拼凑得解。
假设一号柱子有 \(k\) 个黑球,那么:移动二号柱子的 \(k\) 个球至三号柱子,将一号柱子的黑球移到二号柱,白球移到三号柱,最后先取回三号柱的白球再取回二号柱的黑球,操作次数上限为 \(4m\) 。
知道做 \(n=2\) 后就不难得到一般做法了,具体可以考虑分治,再每一层中,先用上述算法整理柱子(消耗 \(4mn\) 步),然后考虑怎么拼凑。
随便取两个柱子,如果加起来黑色球多的话,那么可以先倒装一个柱子,将另一个柱子的黑白分开后,再将倒装柱子装回去;如果加起来白色球多的话,那么先取所有的黑色球,将剩下的两个白色尽可能合并后再把黑色球装回来。无论是哪种情况,单次消耗的步数都是 \(3m\) 。
那么一层消耗的总步数的理论上限为 \(7nm\),故总操作次数理论上限为 \(7nm\log n\),消耗的步数在题目限制的边上。
T4
先考虑前 \(80\) 分,只需要考虑走出去的时候是哪一维走出去了即可,枚举这一维,然后看其他维有多少选择。
具体做法就是处理出 \(t(i,j)\) 表示第 \(i\) 维第 \(j\) 个位置走多久走出去,然后将 \(\sum w_i\) 个元素按照时间排序后就能线性做了。
接下来考虑满分做法,注意到对于 \(i\),\(t(i,j)\) 是一个先单调不减,后单调不增的函数。这两部分,一部分是在第一轮内就直接出去了,这样的位置个数是 \(O(n)\) 且需要的时间不超过 \(n\),暴力处理;另一部分是走了超过 \(n\) 步的,让我们来分析一下:
令 \(p_{j}<n\) 表示向着要走出的方向,从起点开始最远走了 \(j\) 步的时间,如果单轮走不了这么远就不定义 \(p_j\) 。注意到,因为一轮走的最远的距离并不代表一轮结束后到达的距离,所以,因为另一部分可以表示为 \(t+kn,(t<n,k\geq 1)\) ,对于 \(k=1\) 的周期,因为不需要考虑上一轮的最远距离和结束距离的偏差,所以有可能和 \(k>1\) 的周期不一样,但是对于 \(k>1\) 的周期,因为一定需要考虑上一轮最远距离和结束距离的偏差,所以一定一样。
也就是说,一个维度只需要处理 \(O(n)\) 个位置的值,剩下的位置的值都是一个一个长度不超过 \(n\) 的周期不断循环的,并且剩下的位置的值一定都大于 \(2n\),前面处理的位置一定都不超过 \(2n\) ,所以可以直接分成两部分做。
前一部分按照 \(80\) 分做法做即可,后一部分是简单的计数问题。
代码:口胡,不想实现。
原文地址:https://www.cnblogs.com/qiulyqwq/p/15202237.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 你的接口真的安全吗?
- ubuntu搭建常见开发环境
- 基于 Kubernetes,Helm 及 Jenkins 实现弹性 CI/CD
- Go by Example 中文版: 读文件
- Apache Shiro权限框架理论介绍
- 【技术创作101训练营】Linux服务器的晴雨表—top命令
- 微服务之间的通信的方式
- Python从入门到熟练(7):函数
- Django调用百度地图api在地图上批量增加标记点
- Spring Cloud Config - 统一配置中心
- 从头分析一则traceId穿透问题(附解决方案)
- openldap的介绍与安装
- docker搭建环境如何配置端口
- Go语言入门(二)-流程控制
- 【Java8新特性】02 函数式接口和Lambda表达式实战练习:环绕执行模式使行为参数化