当前位置: 首页 > news >正文

题解:cses2180 Coin Arrangement

传送门

很小清新的思维题。

题意:很简单了,不再赘述。

做法:

首先对于一行的非常好做,我们直接考虑第 \(i\) 个位置一定匹配到第 \(i\) 个硬币,直接计算答案即可,设硬币的前缀和为 \(s_i\),则答案为 \(\sum\limits_{i=1}^n |i-s_i|\),意义为考虑当前这个点需要被经过多少次。

注意到一个事情,我们显然可以让所有棋子先上下移动再在内部左右移动。

那么现在是两行又该怎么做,一种想法是 dp,我们考虑 \(dp_{i,j}\) 代表考虑到了第 \(i\) 列,并且目前第二行放了 \(j\) 个的最小代价,直接考虑第 \(i\) 列放了多少个可以做到 \(O(n^3)\),但是显然硬币数这么小,我们考虑把 \(dp\) 改为枚举每个硬币就可以做到 \(O(n^2)\)

注意到转移形似一个加一个绝对值函数然后取 min 的状物,可能可以通过线段树等方法优化 dp。


但是其实有更美妙的想法。

我们先进行转化,将所有位置减去 \(1\),那么答案就是 \(\sum |s_i|\)

我们考虑对上下两行同时记录前缀和,如果上下两个的前缀和异号,那么我们就令硬币上下移动到他们同号,贪心即可。

考虑为什么是对的,因为你正常在行内部移动时,你对答案的贡献最多为 \(1\),而将异号的往内缩有 \(2\) 的贡献,所以这样一定时更优的。

代码非常好写,复杂度 \(O(n)\)

http://www.aitangshan.cn/news/361.html

相关文章:

  • imx766在rk3588上的驱动
  • 假期进度报告3
  • nslookup命令
  • ping命令参数
  • P5873 [SEERC 2018] Points and Rectangles 解题报告
  • watch命令
  • About Me
  • wget命令参数
  • 2025.8.10学习日记【PyCharm的入门导览】
  • 电子 Doro 安装步骤
  • ps命令详解
  • 面向对象编程:封装
  • 8 面向对象编程 8.8 接口
  • 2025牛客多校第八场 根号-2进制 个人题解 - CUC
  • vCenter上更新证书后,Citrix Delivery Controller(DDC)提示证书不可用
  • 不定长滑动窗口模板
  • 题解:CF1179D Fedor Runs for President
  • 数论杂记 2025.8.11始
  • 8 面向对象编程 8.5. final 关键字 8.6 抽象类 8.7 抽象类最佳实践-模板设计模式
  • [Atlas200I A2] 安装torch-npu
  • 题解:[Vani有约会] 雨天的尾巴 /【模板】线段树合并
  • 8.11随笔
  • 蒸馏大型语言模型并超越其性能
  • 每日随笔
  • webrtc自定义端口和host
  • 第二十九天
  • 【20250805省选训练】T3-简单树题
  • 让CPU省电的方法
  • IFEO劫持
  • GAS_Aura-Highlight Enemies