P15404 [NOISG 2026 Prelim] 玲珑宝塔 题解
lucasincyber · · 题解
题目传送门
思路
首先,答案具有单调性,即如果
考虑一层一层地建造这
时间复杂度
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 5;
int n, k, w;
int a[N], lst[N];
bool check(int mid)
{
if (mid == 0) return 1;
for (int i = 1; i <= mid; i++)
lst[i] = -2e9;
int cnt = 0, id = 1;
for (int i = 1; i <= n; i++)
{
if (a[i] - lst[id] >= w)
{
lst[id] = a[i];
if (id == mid)
{
cnt++;
id = 1;
}
else id++;
}
}
return (cnt >= k);
}
signed main()
{
scanf("%lld%lld%lld", &n, &k, &w);
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
sort(a + 1, a + n + 1);
int l = 0, r = n / k, res = 0;
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(mid)) res = mid, l = mid + 1;
else r = mid - 1;
}
printf("%lld\n", res);
return 0;
}