题目

题目概要
有一个长度为 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. 二阶声波正演c语言程序_嵌入式开发中的三种程序构架
  2. php如何隐藏入口文件,PHP怎样隐藏入口文件
  3. 在测试集上训练,还能中CVPR?这篇IEEE批判论文是否合理?
  4. MacOS/MacBook设置短语快捷键
  5. [高效时间管理]复盘篇
  6. 教育部最新公布!2019年高校新增和撤销了这些本科专业
  7. Linux防火墙-SELinux、netfilter、iptables、ifconfig
  8. Linux学习之二十、循环
  9. android studio: 让项目通过阿里云 maven jcenter 下载依赖资源
  10. 【面试必会】java分布式事务面试题
  11. 运筹学考题汇总(填空题+计算题)带答案
  12. nat123内网穿透
  13. HTTPD虚拟主机配置
  14. Android中@GuardedBy
  15. python牛顿法算立方根_Exercise 1.8 牛顿法求立方根
  16. Excel同时检测两列的重复值的方法
  17. 实战三:手把手教你实现物体识别
  18. Flutter开发之——序列化失败-have not been migrated to null-safety
  19. 虾皮Shopee上货铺货助理工具
  20. [Leetcode] 741. Cherry Pickup 解题报告

热门文章

  1. 怎么用虚拟机搭建云服务器,利用虚拟机搭建云服务器
  2. 个人云盘:阿里云无影,百度网盘、腾讯微云争霸?
  3. IntelliJ IDEA使用记录:maven projects-compile提示【**类,找不到符号】
  4. 小猿圈:web前端工程师工资有多高?
  5. Dubblo +zookeep+sprinboot注册发现 (二)来源与狂神
  6. 独家对话 RT-Thread 创始人熊谱翔:国产操作系统厚积而薄发 | 人物志
  7. 史上最详细教你制作“U盘启动盘”重装Windows10系统
  8. 产品设计:axure的基本使用
  9. MySQL执行多表联查时,报错ln aggregated query without GROUP BY
  10. matlab里用多边形裁剪图片,多边形裁剪图片与自定义 Gizmo Cocos Creator