题目大意:n,k,x 为原本数组长度 ,可加任意位置任意数次数 ,数组相邻的两个数差值小于等于x
求最小可以将原本数组分成几个子数组 满足x
题解:将原数组排序,再将相邻的两个数差值大于x的数记下 ,并且(差值-1)/x 表示用掉几次k
因为1k可以维持1 x 连续
例: 1 1 5 8 12 13 20 22 变成 1 1 5 8 12 13 20 22 -》 4 4 7-》 1 1 2
#include <iostream>
#include <cmath>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long int ll;
ll a[200005];
ll b[200005];
int main()
{
int cnt = 0, ans = 1;
ll n, k, x;
cin >> n >> k >> x;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
sort(a, a + n);
for (int i = 1; i < n; i++)
{
ll de = a[i] - a[i - 1];
if (de > x)
{
de--;
b[cnt++] = de / x;
}
}
sort(b, b + cnt);
ans += cnt;
for (int i = 0; i < cnt; i++)
{
//cout << b[i] << " ";
if (k >= b[i])
{
ans--;
k -= b[i];
}
}
//cout << endl;
cout << ans << endl;
}