C. Stable Groups
题目传送门:
题面截图:
题目大意:
有
n
n
n名学生,每名学生有水平
a
i
a_i
ai ,将其分为几个稳定组。
稳定组定义:将组内学生排序后,两两间水平差不超过 x 。
允许增加任意水平的 k 名学生。求让组数最少能是多少。
思路:
先排序看看现在能分成几个组,然后组间从小往大用那k个人让两组合并,直到任意水平的人数少到无法让两组合并为止。
贪心。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
typedef long long ll;
ll a[maxn];
ll b[maxn];
struct Node {
ll num;
ll maxx;
ll minn;
};
vector<Node> v;
int main() {
ll n, k, x;
cin >> n >> k >> x;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + 1 + n);
ll cnt = 0;
ll ans = 1;
vector<ll> v;
for (ll i = 2; i <= n; i++) {
if (a[i] - a[i - 1] > x) {
ll t = (a[i] - a[i - 1] - 1) / x;
v.push_back(t);
ans++;
}
}
sort(v.begin(), v.end());
for (ll i = 0; i < v.size(); i++) {
if (k - v[i] >= 0) {
k -= v[i];
ans--;
} else {
break;
}
}
cout << ans << "\n";
}