赞
踩
这个题没有想象中那么难,和
在排序之后,进行贪心。首先我们考虑如果要满足题意,一共需要分为
羞耻的分割线:
感谢评论区大佬给予及时的指正,上述思路会
首先,必须排序,然后我们设置一个
这里,我们还需要引入一个
以上只是个人拙见,如另有高见,敬请指点一二!
代码 One:
// WA78
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 5e5 + 10;
int n, k, d;
int a[MAXN];
int main()
{
cin >> n >> k >> d;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
int m = n / k, pos = 0;
while (m && pos < n)
{
m--;
int mx = a[pos] + d;
while (pos < n && (n - pos > m * k) && a[pos] <= mx)
{
pos++;
}
}
if (m == 0 && pos == n)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
代码 Two:
// AC1
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
const int MAXN = 5e5 + 10;
int n, k, d;
int a[MAXN], pos[MAXN];
int ans[MAXN], dif[MAXN];
int main()
{
scanf("%d%d%d", &n, &k, &d);
for (int i = 0; i < n; i++)
{
scanf("%d", a + i);
}
sort(a, a + n);
int ptr = 0;
for (int i = 0; i < n; i++)
{
while (ptr < n && a[ptr] - a[i] <= d)
{
ptr++;
}
pos[i] = ptr; // i ~ ptr - 1 差值小于等于 d 且 ptr 最大
}
ans[0] = 1; // i 作为下一个分组的起点的情况数
dif[1] = -1; // 控制下一个起点的范围,如果当前 i 为起点,那么 i + k 可以为下一个起点,
// 换言之,对于 i 为起点的情况,他的终点必须在 i + k - 1 ~ pos[i] - 1 这个范围
// 所以 i + k ~ pos[i] 可以作为下一个起点,而 pos[i] + 1 则不能作为下一个起点
// 因为 ans[i] = ans[i - 1] + dif[i],所以只需要设置
// dif[i + k]++ 与 dif[pos[i] + 1]-- 即可
for (int i = 0; i < n; i++)
{
if (i)
{
ans[i] = ans[i - 1] + dif[i];
}
if (ans[i] == 0)
{
continue;
}
if (pos[i] - i < k)
{
continue;
}
dif[i + k]++;
dif[pos[i] + 1]--;
}
ans[n] = ans[n - 1] + dif[n];
puts(ans[n] ? "YES" : "NO");
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。