#3968. [USACO16OPEN] Diamond Display B
[USACO16OPEN] Diamond Display B
题目描述
奶牛Bessie最近迷上了收集钻石的爱好!她已经收集了N颗大小不同的钻石(N ≤ 1000),想在牛棚的展示柜中摆放一些。为了美观,Bessie决定如果两颗钻石的大小差超过K就不能同时展示(大小差恰好等于K的可以一起展示)。给定K值,请帮助Bessie计算她最多能展示多少颗钻石。
输入格式
第一行:两个整数N和K(0 ≤ K ≤ 10,000)
接下来N行:每行一个整数表示钻石大小(均为正数且不超过10,000)
输出格式
一个正整数,表示Bessie能展示的最大钻石数量
输入输出样例
输入 #1
5 3
1
6
4
3
1
输出 #1
4
样例解释
钻石大小排序后:[1, 1, 3, 4, 6]
最大展示组合:
- 1, 1, 3, 4(相邻钻石大小差不超过3)
- 或者1, 3, 4, 6(相邻钻石大小差不超过3)
因此最多可以展示4颗钻石。
解题思路
- 将钻石大小排序
- 使用滑动窗口法:
- 维护一个窗口[left, right]
- 对于每个left,找到最大的right使得diamonds[right] - diamonds[left] ≤ K
- 窗口大小(right-left+1)即为当前可展示的钻石数
- 记录所有窗口中最大的大小作为答案
时间复杂度:O(N log N)(排序) + O(N)(滑动窗口) = O(N log N)