链接:
https://codeforces.com/problemset/problem/1539/C
题意:
给你n个数,把这n个数分成几个稳定的组,如果每个数之间的差值小于等于n,则这个组称为稳定的组。可以向这几个数中增加k个数,求增加k个数后,可以分到最小的组的数量。
input
8 2 3 1 1 5 8 12 13 20 22
output
2
input
13 0 37 20 20 80 70 70 70 420 5 1 5 1 60 90
output
3
本题可以先对原有数组升序排序,再计算每一个数之间的差值,需要放几个数,让两个数连起来,成为稳定的组,我们将这个值存在另一个数组,将该数组升序排序,然后循环,每次都讲k值减少数组对应元素的值,如果k的值小于数组对应元素的值,就将ans++。
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
using namespace std;
typedef long long ll;
ll a[200003];
ll b[200003];
int main() {
int n;
ll k, x;
cin >> n >> k >> x;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
ll cnt = 0;
for (int i = 1; i < n; i++) {
if (a[i] - a[i - 1] > x) {
b[cnt] = (a[i] - a[i - 1] - 1) / x;
cnt++;
}
}
sort(b, b + cnt);
ll ans = 1;
for (int i = 0; i < cnt; i++) {
if (k >= b[i]) {
k -= b[i];
}
else {
ans++;
}
}
cout << ans;
return 0;
}