核心思路
每个合格抽检组占用连续 3 个位置,被选中的组不能共用工件,因此所选组的起点下标两两至少相差 3。从左到右扫描:一旦当前位置起的三件合格,就立刻取走这一组,并把扫描位置跳过这三件;否则只右移一位。放弃当前最左的合格组不会得到更优答案,因为后面的组最多再占用这三件中的一部分,组数不会因此增加。
实现方法
用 qi,qi+1,qi+2 的最大值减最小值判断是否合格。维护扫描下标 i,合格则答案加一并将 i 增加 3,否则 i 增加 1。也可用 f[i] 表示前 i 件的答案:f[i]=f[i−1],若最后三件合格则再与 f[i−3]+1 取最大,复杂度相同。
一条质检线上依次排出 n 件工件,第 i 件的质量读数为 qi,另有非负整数公差 t。
对每个满足 1≤i≤n−2 的下标 i,把连续三件 {qi,qi+1,qi+2} 看成一个候选抽检组。若
max(qi,qi+1,qi+2)−min(qi,qi+1,qi+2)≤t,则该抽检组合格。
可以选用任意多个合格抽检组,也可以一个都不选。被选用的抽检组两两不能占用同一件工件。求最多能选出多少个合格抽检组。
第一行两个整数 n 和 t(1≤n≤2×105;0≤t≤109),表示工件数量与公差。
第二行 n 个整数 q1,q2,…,qn(0≤qi≤109),表示各工件的质量读数。
输出一个整数,即最多能选出的合格抽检组个数。
输入
10 5
10 12 8 15 11 14 20 22 19 3
输出
3
说明
可以选用下标 1,2,3、4,5,6、7,8,9 三个抽检组。它们互不占用同一工件,且每组内最大值与最小值之差都不超过 5。第 10 件无法再组成抽检组。
输入
8 0
4 4 4 4 2 2 2 9
输出
2
说明
可以选用下标 1,2,3 与 5,6,7 两个抽检组。公差为 0 时组内三个读数必须相同;最后一件读数为 9 的工件无法单独成组。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册