问题描述
- 给你一组数,给你kkk次机会加一位任意成绩的学生,要你求出能把这组数划分成多少个(最多)稳定的小组。
- 稳定的小组是指这个小组按成绩的大小排序后,每个学生和与他相邻并且比他成绩小的同学的成绩差小于给你的一个数xxx。即ai+1−ai<=xa_{i + 1} - a_{i} <= xai+1−ai<=x。
思路分析
- 因为题目要我们求能得到最多多少组的稳定的小组,那么我们应该把不满足要求即两位同学成绩之差大于xxx的成绩差放到一个数组或者向量中。因为我们只是把成绩按大小排序了,而差值不一定是升序的,所以我们应该把大于xxx的成绩差先存起来,最后再进行排序,分配机会去加数,这样才能保证能够得到最多组稳定的小组(自己好好想一想,其实很好理解)。
- 然后就是如果这个差值刚好是xxx的倍数时,我们只需要分配倍数−1{倍数 - 1}倍数−1次机会即可,其他的不需要减一。
代码如下
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2e5 + 10;
ll a[maxn];
vector<ll> num;
ll n, k, x, cnt;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> k >> x;
++cnt;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
sort(a + 1, a + 1 + n);
for (int i = 2; i <= n; i++)
{
if (a[i] - a[i - 1] > x)
{
cnt++;
num.push_back(a[i] - a[i - 1]);
}
}
sort(num.begin(), num.end());
for (int i = 0; i < num.size(); i++)
{
if (num[i] % x == 0 && k >= ((num[i] / x) - 1))
{
k -= (num[i] / x - 1);
cnt--;
}
else if (k >= (num[i] / x))
{
k -= (num[i] / x);
cnt--;
}
else
{
break;
}
}
cout << cnt << endl;
return 0;
}