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]