题目

题目概要
有一个长度为 nnn 的数组,初始时每个位置都是 000 。每次操作可以让相邻的两个元素 +1+1+1 和 +2+2+2(可以是左边 +1+1+1,也可以是右边)。问最少需要操作多少次,使得操作后第 iii 个元素不小于阀值 hih_ihi​ 。

数据范围与提示
n⩽106n\leqslant 10^6n⩽106 且 hi⩽106h_i\leqslant 10^6hi​⩽106 。

思路

由于一次操作必然使得总和 +3+3+3,问题变为最小化 “浪费”。为了成全 (i+1)(i{+}1)(i+1) 而牺牲 iii 是不明智的:假设 iii 爆表了,它可以去掉 ⟨1,2⟩\langle 1,2\rangle⟨1,2⟩,或者将 ⟨2,1⟩\langle 2,1\rangle⟨2,1⟩ 换成 ⟨1,2⟩\langle 1,2\rangle⟨1,2⟩ 。因此从左到右扫描,总是只需要将当前数字填满到 hih_ihi​ 。

普通贪心是,同时让下一个数尽可能小,这样可以避免爆表。但这东西可以隔山打牛:下一个数太小,会导致下下个数过大。

那么只可能是 反悔贪心 嘛。显而易见的反悔方法是,把 ⟨2,1⟩\langle 2,1\rangle⟨2,1⟩ 换成两个 ⟨1,2⟩\langle 1,2\rangle⟨1,2⟩,这可以让下一个数 +3+3+3 。

但我们还要 对 “反悔操作” 进行反悔。考虑其影响:若不使用反悔操作,则下一个数的 +3+3+3 需要用 3×⟨1,2⟩3\times\langle 1,2\rangle3×⟨1,2⟩ 或 ⟨1,2⟩+⟨2,1⟩\langle 1,2\rangle+\langle 2,1\rangle⟨1,2⟩+⟨2,1⟩ 填补,这会使得下下个数 +3+3+3 或 +6+6+6 。也就是说:每撤销一个 +3+3+3 操作,就可以让再下一个数 +3+3+3 一或两次。

除了反悔操作,遵循下一个数尽量小的原则,优先用 ⟨2,1⟩\langle 2,1\rangle⟨2,1⟩ 再用 ⟨1,2⟩\langle 1,2\rangle⟨1,2⟩ 。按上面所说的,⟨2,1⟩\langle 2,1\rangle⟨2,1⟩ 可以带来一次反悔,而 ⟨1,2⟩\langle 1,2\rangle⟨1,2⟩ 不可。

所以就做完了。正确性似乎是显然的——每一步,我们都尽量最小化了 “浪费”,并且给出了反悔的方式。

复杂度 O(n)\mathcal O(n)O(n),并且代码极其简单。

代码

代码实现的时候,+6+6+6 看成两个 +3+3+3 的机会就行了。

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
inline int readint(){int a = 0; char c = getchar(), f = 1;for(; c<'0'||c>'9'; c=getchar())if(c == '-') f = -f;for(; '0'<=c&&c<='9'; c=getchar())a = (a<<3)+(a<<1)+(c^48);return a*f;
}int main(){int n = readint();long long ans = 0;int v = 0; // already builtint chance = 0; // how many repent is allowedfor(int i=1; i<=n; ++i){int h = readint(); ans += h;h -= v, v = 0; // what's to doif(h <= 0){ // finishedchance = 0; ans += (-h);continue; // waste -h}int x = min(h/3,chance); // how many +3 is appliedint y = (h-3*x)>>1; // how many <2,1> is appliedv = (((h-3*x)&1)<<1)+y; // if <1,2> is appliedchance = (x<<1)+y; // +3 here can be twice +3 there}ans += v; // build on virtual n+1printf("%lld\n",ans/3);return 0;
}

后记

题解中提到了 “建隐式图”、“正权反悔边” 啥的,估计更精妙,我只是一个朝三暮四的人罢了。

另外,忘掉具体的操作,这一点也很重要。我在考虑反悔 +3+3+3 时,固执地认为,只能有一次 ⟨1,2⟩\langle 1,2\rangle⟨1,2⟩,然后就把自己给绕进去了……反正,用 dp\tt dpdp 的话来说,不是状态定义的量,你管他咧

[FOI2020]楼房搭建相关推荐

  1. (FJWC2020)DTOJ 4681. 楼房搭建

    题意 小 H 是一个建筑师,他接到了一个任务--按照计划图搭建一排楼房.计划图上从左到右 给出了 n n n 个非负整数,对于第 i i i 个数 h i h_i hi​ ,它表示在 i i i 这个 ...

  2. 【JZOJ 省选模拟】楼房搭建(building)

    题目 Description 小 H 是一个建筑师,他接到了一个任务--按照计划图搭建一排楼房.计划图上从左到右 给出了 n 个非负整数,对于第 i 个数 h i ,它表示在 i 这个位置搭建出来的楼 ...

  3. 一名UI设计师眼中的用户体验

    一名UI设计师眼中的用户体验 最近在面试寻找设计方面的工作,因我的职业规划偏向于视觉.用户体验方面.在面试过程中,大部分的面试官都会问我:你怎么看待用户体验? 一直以来,我对用户体验和交互设计有点概念 ...

  4. 对于web前端工程师ui

    现在做一个web程序再也不是简单单的只会代码了,有些东西还是要学习一下UI设计ue设计.不然你做出来的东西,别人看来就是渣渣,虽然你实现的功能强大,但是这是一个颜值的时代.所以我就来谈谈 我对与ui和 ...

  5. java搭建房子图片,漂亮的农村一层半自建楼房户型图片大全

    现如今很多农村年轻人都走进了城里,有的学习.有的打工,很多人也在城里成了家,甚至置了业买了房.而农村老家的房子基本都是老一辈人在居住.年轻人逢年过节才会回老家住几天.而老家的房子却大多都是年久失修,不 ...

  6. 公司网络机房搭建,信息化目标,网络故障处理办法

    公司网络机房搭建,信息化目标,网络故障处理办法 公司网络机房搭建注意事项 网络机房,对公司而言,一般都只有一次搭建机会,拆除重建或者更换位置,将会带来不可估量的损失,所以,在搭建准备之初,就需要充分的 ...

  7. 从Zero搭建一个属于自己的机房

    侃 今年年初的时候由于自己买的阿里云服务器性能不够(主要是家境贫寒),导致部署在阿里云服务器上的一些服务虽然勉强能跑起来,但是CPU和内存各种爆表,而且服务常常因为没有内存而变得异常难受,后期虽然升级 ...

  8. 虚拟驾驶环境搭建(一)

    龙云尧个人博客,转载请注明出处. CSDN地址:http://blog.csdn.net/michael753951/article/details/75073333 个人blog地址:http:// ...

  9. 正式压力测试:locust进阶,超简单搭建生产级locust集群

    locust进阶,搭建生产级locust集群 本教程基于k8s集群搭建,使用helm作为包管理工具 通过helm安装locust

  10. 使用Docker搭建svn服务器教程

    使用Docker搭建svn服务器教程 svn简介 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很 ...

最新文章

  1. 不是报错就是崩盘,这些代码迁移问题你遇到过几个?
  2. Android微信智能心跳方案
  3. Django 函数和方法的区别
  4. c# 写文件注意问题及用例展示
  5. html:web前端开发规范
  6. 你们的前端是怎么入门的?(并且找到工作)?
  7. python的误差条形图的解释_python – Seaborn因子图自定义误差条
  8. python基础教程视频-Python基础视频教程全集
  9. c# 使用NPOI按模板导出excel
  10. android11代码关机
  11. 如何在计算机设置鼠标宏,鼠标宏怎么设置,详细教您鼠标如何设置宏
  12. python ipo模型是什么意思_IPO里的估值模型是什么情况?
  13. 转《DB2操作指南及命令大全》
  14. Real-Time Rendering 4th Edition 实时渲染第四版 第五章 着色基础(Shading Basics)
  15. Quartz 2.4.0 源码解析
  16. 笔记本 键盘 唤醒计算机,笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决...
  17. C# 调用外部exe程序,出现已停止工作
  18. 高中数学立体几何高考真题解题技巧(名师总结)
  19. 菜鸟初学JQuery
  20. 贝勒大学计算机专业,贝勒大学计算机科学.pdf

热门文章

  1. openstack RPM打包
  2. efi分区能不能删除 win10_Win10不小心把EFI分区删除怎么恢复?
  3. 使用Tor以加密方式发送BCH
  4. HDAO 全新项目落地,带动区块链新一轮牛市
  5. HTML5期末大作业:关于家乡介绍的HTML网页设计——郑州美景HTML+CSS(5页) 学生DW家乡介绍网页设计作业成品 web课程设计网页规划与设计
  6. onenote登录显示服务器问题,onenote启动不了怎么回事 onenote为什么登录显示无法连接...
  7. 三维扫描用于3D打印技术
  8. 5gh掌上云计算认证不通过_2018年阿里云ACP云计算认证多少分通过,怎么报名,如何参加考试...
  9. 小程序加载本地图片报错500
  10. 2018年12计算机应用基础统考,2018年12月统考通知