博客
关于我
干草堆题解
阅读量:740 次
发布时间:2019-03-22

本文共 2188 字,大约阅读时间需要 7 分钟。

一、前言

我在阅读众多博客后,发现关于为什么最底层的宽度最小且高度最高的解释尚不充分,因此决定通过自己的思考得以探索。由于自身缺乏专业视角,仅能提供一个大致的证明思路。

二、证明

(1)LH sb 证明1,暴力讨论法

直接从正面解释高度最值的条件较为困难,因此我们尝试通过柯老师提出的“正难则反”和“better than anyone”思想来探讨问题。

假设当最底层的宽度为f[i]时,干草堆的高度为一个最大值。为了证明当最底层宽度增大时,堆高反而会降低,我们可以进行以下分析:

  • 要将草堆从上层移动到底层,如果底层宽度变大而不新添加草堆,唯一的方法是从上层取出部分草堆将其放入最底层。

    (1)上层不满足要求

    • 如尝试将③号草堆取到最底层,上层将失去满足条件的状态,进而迫使又必须向上取草堆
    • 这种情况导致上层高度只能下降。

    (2)上层满足要求

    • 如图所示,当最底层将三号草堆包括进来,上层依然满足条件
    • 若上层能够将某一段草堆放至上上层,则这种方案并非最佳
    • 若上层无法将草堆放至上一层,则必然不会出现比此方案更优的情况,因而高度不变
    • 综上,可证:当最底层宽度最小时,高度达到最优

(2)证明2,由实现得到的灵感

重新审视问题,以外部视角进行验证:

  • 将初始状态的草堆变为另一种状态时,上层可选择的草堆范围变化
  • 例如,选择[1,3]段的草堆,而下一状态可选择[1,3)段
  • 原始状态含有更多选项,在最坏情况下不超过下一状态(将草堆3放至最底层)
  • 增大最底层宽度只会导致高度下降或不变

三、实现

基于上述证明,轻松编写代码:

#include <_vector>#include 
#include
using namespace std;#define LL long long#define ULL unsigned long longtypedef uint64_t ULL;template
void read(T &x) { x = 0; ULL f = 1; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); } while (c >= '0' && c <= '9') { x = (x < 1) ? x : x; x = x * 10 + (c - '0'); c = getchar(); } x *= f;}void write(ULL x) { if (x < 0) { x = -x; putchar('-'); } if (x > 9) { write(x / 10); } putchar(x % 10 + '0');}ULL Max(ULL x, ULL y) { return x > y ? x : y; }ULL Min(ULL x, ULL y) { return x < y ? x : y; }ULL Abs(ULL x) { return x > 0 ? x : -x; }const int Maxn = 1e5 + 5;int n;int a[Maxn], f[Maxn], h[Maxn];ULL fall[Maxn];int main() { read(n); for (int i = 1; i <= n; i++) { read(a[i]); } for (int i = n; i >= 1; i--) { fall[i] = (fall[i+1] + a[i]); } for (int i = n; i >= 1; i--) { int j; do { add(j); j = q[tt]; } while (f[j] + fall[j] <= f[tt] + fall[tt]); if (j <= n+1) { f[i] = fall[i] - fall[j]; h[i] = h[j] + 1; } break; } write(h[1]); return 0;}void add(int x) { while (hh <= tt && (f[x] + fall[x]) <= f[q[tt]] + fall[q[tt]]) { tt--; q[hh] = x; hh++; } q[tt] = x; tt++;}

代码逻辑为:

  • 计算草场每处的后缀和
  • 使用队列维护单调升序
  • 确定每处最大可达高度
  • 读取初始数据并进行预处理
  • 最后输出结果
  • 本文完整解释了最底层宽度最小时高度时的最佳状态,方法简单直观,易于理解和复现。

    转载地址:http://vfbwk.baihongyu.com/

    你可能感兴趣的文章
    python语言:装饰器原理
    查看>>
    Python 交互式数据可视化详解
    查看>>
    python语言有哪些优点和缺点_Python有哪些优缺点,你了解吗?
    查看>>
    Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
    查看>>
    Python 从数据库中存储和检索密码的最安全方法
    查看>>
    Python语言及其应用 - 知识点遍历
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>
    python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
    查看>>
    python 使用filetype校验文件
    查看>>
    Python 使用flush函数将缓冲区数据立即写磁盘
    查看>>
    python 使用in判断不准确,in不好使
    查看>>
    Python 使用pandas 进行查询和统计详解
    查看>>
    Redis 配置文件redis.conf详细解释
    查看>>
    python网络爬虫(2)——scrapy框架的基础使用
    查看>>
    python网络爬虫实例教程试读_Python网络爬虫实战教程(全套完整版) - 学途无忧网 - 做技术的王者 - Powered By EduSoho...
    查看>>
    Python 使用哈希函数用于加密
    查看>>
    Python 依赖管理的革新——Poetry 深度解析
    查看>>
    python 保留精度及增加去除数字的千位分隔符(金额化数字)
    查看>>
    python 倒计时 9,8,7,。。。。。。0
    查看>>