欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 【QED】hhuggo的完美木桶

【QED】hhuggo的完美木桶

2025/9/27 13:42:44 来源:https://blog.csdn.net/m0_67724631/article/details/144948403  浏览:    关键词:【QED】hhuggo的完美木桶

文章目录

  • 题目
    • 题目描述
    • 输入输出格式
    • 数据范围
    • 测试样例
    • 样例说明
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度

题目

题目链接🔗

题目描述

总所周知,木桶效应是说一个木桶所能装的水的多少取决于最短的那个木板。现在 hhuggo \text{hhuggo} hhuggo n n n 个木板, hhuggo \text{hhuggo} hhuggo 在听了 kiwi \text{kiwi} kiwi 说的木桶效应后,他想试试将这些木板拼接成一个木桶,但是 hhuggo \text{hhuggo} hhuggo 对木桶的样貌有一定的要求,他希望每个木板的长度差异不超过 k k k,那么这些木板拼起来的木桶就是完美的。
hhuggo \text{hhuggo} hhuggo 想知道,他最后最多能用多少个木板拼成一个完美木桶?

输入输出格式

【输入格式】

测试用例的第一行包含两个整数 n n n k k k。表示有 n n n 个木板, hhuggo \text{hhuggo} hhuggo 对木板长度差异的要求为 k k k

第二行包含非递减的 n n n 个整数 a 1 , a 2 , a 3 . . . , a n a_1,a_2,a_3...,a_n a1,a2,a3...,an,其中 a i a_i ai 是第 i i i 个木板的长度。

【输出格式】

对于每个测试用例,输出一个整数,表示 hhuggo \text{hhuggo} hhuggo 最多能用到的木板数量。

数据范围

1 ≤ n ≤ 1 × 1 0 4 1 \le n \le 1 \times 10^4 1n1×104

1 ≤ k ≤ 1 × 1 0 6 1 \le k \le 1 \times 10^6 1k1×106

1 ≤ a 1 ≤ . . . ≤ a i ≤ . . . ≤ a n ≤ 1 × 1 0 8 1 \le a_1 \le ... \le a_i \le ... \le a_n \le 1 \times 10^8 1a1...ai...an1×108

测试样例

input1

10 5
1 4 14 17 18 19 19 26 26 29 

output1

5

input2

6 5
1 2 10 12 15 17

output2

3

样例说明

在第一个样例中, hhuggo \text{hhuggo} hhuggo 最多能用长度为 14,17,18,19,19 这 5 个木板。

思路

简明题意

给出一个不下降数组,在数组中选m个元素,并且满足这m个元素极差小于等于k,求m的最大值。

  • 关键点:因为数组是非递减的,我们只需要选取数组中连续的区间,使得这个区间内的最大值和最小值的差小于等于 k k k
  • 双指针法:可以利用双指针技巧来优化时间复杂度:
    • 设定两个指针 l l l r r r,代表当前区间的左右边界。
    • 初始时, l = 1 l = 1 l=1 r = 1 r = 1 r=1,然后我们通过移动右指针 r r r 扩展区间,直到 a r − a l > k a_r - a_l > k aral>k
    • 每次扩展区间后,计算当前区间的长度(即木板的数量),更新最大值。
    • a r − a l > k a_r - a_l > k aral>k 时,移动左指针 l l l,缩小区间,直到满足条件。

这种方法只需要遍历一次数组,所以时间复杂度为 O ( n ) O(n) O(n)

代码

#include<bits/stdc++.h>
using namespace std;const int N = 1e4 + 10;
int n, k, a[N];int main() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> a[i];}int ans = 1;  // 至少能选一个木板for (int i = 1, j = 1; i <= n; i++) {while (j + 1 <= n && (a[j + 1] - a[i]) <= k) {j++;  // 扩展区间}ans = max(ans, j - i + 1);  // 更新最大木板数}cout << ans << endl;  // 输出结果return 0;
}

复杂度分析

时间复杂度

由于双指针的操作是线性的,即每个指针只会遍历一遍数组,所以总体时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是数组的长度

空间复杂度

只使用了一个数组 a[] 来存储木板的长度,其他变量只占用常数空间,因此空间复杂度为 O ( n ) O(n) O(n)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com