2 条题解
-
3
T3 < T1T2T4
此做法简单于bz做法(我声称最简单的)。
区别在于Part2.第一空
对于一个栅栏 ,他能粉刷到的最高的方案是粉刷包含 且长度为 的连续区间中栅栏高度的最小值的最大值。
因为粉刷一个区间的最大高度是区间中栅栏高度的最小值,我们要让这个值最大,以让栅栏 的粉刷高度最大。
可以使用滑动窗口解决,复杂度 。
第二空
对于一个已经刷了,且高度为 的栅栏,我们可以把连续相同 的栅栏看成一组,若一组有 个栅栏,我么对他的粉刷次数就是 ,因为可以重复刷,所以向上取整是对的。
单独对于第二空贴出代码:
clr是colorans2是第二空的答案int cnt=1; for(int i=2;i<=n+1;i++){ if(clr[i]!=0&&clr[i]==clr[i-1]) cnt++; else ans2+=cnt/x+(cnt%x==0?0:1),cnt=1; } -
2
Part 1:最大面积
把每个栅栏看成一个长为 的窗口,选一些窗口覆盖位置,每个位置取覆盖它的窗口高度的 min。最大面积 = 每个位置独立取 max。
对每个窗口 ,定义:
即该窗口能达到的最大高度(受限于窗口内最矮的 )。
位置 能被窗口 覆盖当且仅当 。所以位置 的最终高度:
两次滑动窗口:
- 第一次:滑动窗口 min 求出所有
- 第二次:滑动窗口 max 求出所有
答案 1 = 。
Part 2:最少栅栏数
已知每个位置 需要被高度至少 的窗口覆盖。按高度值分组处理:
对于每种高度 ,有:
- :需要高度 的位置集合
- :能提供高度 的窗口起点集合
对每组 ,贪心:双指针,对每个未覆盖的位置 ,在 中选右端点最远的窗口(即 最大),一次操作覆盖尽可能多的连续位置。
总操作数累加即答案。
复杂度
滑动窗口 O(),贪心按高度分组总共每个位置和窗口各遍历一次 O()。整体 O()。
后记
实际上可以用multiset代替滑动窗口。
- 1
信息
- ID
- 2819
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 6
- 标签
- (无)
- 递交数
- 19
- 已通过
- 8
- 上传者