【题解】干草堆

本文介绍了一道关于数列分段的问题,要求段的和从前往后不上升,同时段数最多。作者首先尝试了正向贪心的思路,但发现会被反例破解。接着,作者提出倒序思考,将问题转化为不使段的和从后往前下降,形成倒金字塔结构。通过这种方式,贪心策略变得可行。虽然初始暴力解法的时间复杂度为O(n^2),但可以通过单调队列优化,寻找满足条件的最小编号j。
摘要由CSDN通过智能技术生成

T4实在做不动,就来颓一篇题解


1.简化题意

就是把一个数列分成若干段,使得这些段的和从前往后不上升,在满足这个要求的情况下段数最多

2.思路

考场上当开始想了一个贪心的思路,就是正着遍历,当这个阶段高度是最优的时候,下一个阶段就直接顺承这个阶段的宽度

但是很容易就会hack:

4
3 1 3 3

上面这个数据, i = 2 i=2 i=2 时高度最优为 1 1 1 ,但是后面就放不下了,相反,如果在 i = 2 i=2 i=2 时只放一层,此时宽度为 4 4 4,这样后两个都能放

虽然这是错的,但是一个很巧的思路就是倒着:

把一个数列分成若干段,使得这些段的和从前往后不上升

换句话说,就是:把一个数列分成若干段,使得这些段的和从后往前不下降,就是做一个倒金字塔

这样,我们就会发现这个贪心思路是可行的,因为当我们已经可以加一层的时候:

  • 如果选择拓宽本层宽度,那么假设因为这样,下一个可以放,高度增加 1 1 1,最外层宽度为下一个的宽度

  • 相反,如果选择加一层,假设下一个仍可以放,高度增加 2 2 2,最外层宽度为下一个的宽度,假设下一个不可以放,高度增加 1 1 1,最外层宽度为下一个的宽度与这一个的宽度之和

而显然的是,最外层宽度越大,一定不会劣与最外层宽度越小

所以,无论如何,可以加一层的时候,加一层比不加更优

那么我们就可以打出一个暴力的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXN=1e5+5; 
int a[MAXN]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值