题意:
给一个整数数组 a1,a2,⋯,an 和 k ,你想要找到一个最大的值 x ,使得存在另一个整数数组 b1,b2,⋯,bn 满足 |ai−bi|≤k(1≤i≤n) 且 bn 中共有 x 个不同的数。
思路:
思路应当是这样的:
看到最大,应当想到贪心,二分ordp
较为容易的贪心
目的是想要一个数列里不同的数最多
极端情况就是这个数列中所有数都不同
这里是一个类似构造的模型:要构造一个所有数都不同的数列,就去构造一个单调递增or递减的数列
这道题考虑排个序,然后对于b数组中的每一个数都有一个范围:,然后我们要让不同的数最多,我们就只选我们能选的且不重复的最小的数就可以了
为什么这么选?因为如果不这么选,对后面的数的重复个数的贡献只会增加不会减少
因此做法就是排个序,只选我们能选的且不重复的最小的数
Code:(不懂为什么这么多大佬都觉得这道题是签到....
#include <bits/stdc++.h>
using namespace std;
const int mxn=1e5+10;
#define int long long
int a[mxn];
void solve(){
int n,k,l,r,minn=-1e9,cnt=0;
scanf("%lld%lld",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
sort(a+1,a+1+n);
for(int i=1;i<=n;i++){
l=a[i]-k;r=a[i]+k;
if(minn<l){
cnt++;
minn=l;
}else if(minn>=r){
continue;
}else{
cnt++;
minn=minn+1;
}
}
printf("%lld\n",cnt);
}
signed main(){
int T;
scanf("%lld",&T);
while(T--){
solve();
}
return 0;
}
总结:
1.一个构造模型(思想):要让一个数列中不同的数尽可能多,就尽可能的使得这个数列所有数在排序后能单调递增Or递减