CF1539C Stable Groups[题解]
Stable Groups
题目大意
给定 \(n\) 个数 \(a_i\) ,你可以将这些数分成若干组,但每一组的元素满足按升序排列后,相邻两个元素值的差不超过 \(x\) 。在分组前,你可以向这些数中插入至多 \(k\) 个为可以试任意值的元素。
问最少能够分成几组满足要求的数?
分析
其实这道题应该是一个比较明显的贪心吧。
考虑先直接将这 \(n\) 个数尽量分组,实在不能连在一起的就先断开,求出不插入元素最少分出的组。
怎么分?先排个序,然后从头到尾遍历,能够放一起就放,不能也就是差超过 \(x\) 了,断开就完了。
不难发现这样我们分出来的组存在严格的大小关系,于是我们能够很轻松的求出每个组之间的差值。即用元素相对较大组中的最小元素减去元素相对较小组中的最大元素,将其存在数组内。
求出这些差值后我们排个序,然后就可以开始填了,很显然先合并差值小的两个组一定不劣。
CODE
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9') { if(ch=='-') w*=-1; ch=getchar(); }
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int n,k,x,ans;
int tot,a[N],com[N];
inline bool cmp(int x,int y) { return x>y; }
signed main()
{
n=read(),k=read(),x=read();
for(register int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+n+1,cmp);
for(register int i=1;i<n;i++) //不加学生,分组
if(a[i]-a[i+1]>x) com[++tot]=a[i]-a[i+1];
ans=tot+1;
sort(com+1,com+tot+1);
for(register int i=1;i<=tot;i++){
int need=com[i]/x;
if(com[i]%x==0) need-=1;
if(need>k) break;
else k-=need,ans-=1;
}
printf("%lld\n",ans);
return 0;
}