0
点赞
收藏
分享

微信扫一扫

牛客小白月赛24 B-组队(二分)

小猪肥 2022-09-26 阅读 37

地址:​​https://ac.nowcoder.com/acm/contest/5158/B​​

牛客小白月赛24  B-组队(二分)_i++

牛客小白月赛24  B-组队(二分)_ios_02

 

解析:先把数组排序,我们需要取某一段,这一段的最大-最小<=k,关键是取哪一段。可以对于每个数,往后找,找到第一个减它>k的,这中间一段就满足了任意两个数之差<=k了。找的过程可以用upper_lound(,,x),它返回第一个大于x的数。当然也可以直接手写二分了。

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n , k;
cin>>n>>k;
for(int i = 0 ;i < n ; i ++)
cin>>a[i];
sort(a,a+n);
ll maxx=0;
for(int i = 0 ; i < n ; i++)
{
ll md=upper_bound(a,a+n,a[i]+k)-a;
maxx=max(maxx,md-i);
}
cout<<maxx<<endl;
}
}

    或者直接手写二分了

#include<iostream>
#include<vector>
#include<algorithm>
#include<set>
#include<map>
#include<cmath>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll a[maxn];
int main()
{
int t;
cin>>t;
while(t--)
{
ll n , k;
cin>>n>>k;
for(int i = 0 ;i < n ; i ++)
cin>>a[i];
sort(a,a+n);
ll maxx=0;
for(int i = 0 ; i < n ; i++)
{
ll l=i,r=n-1;
ll mid;
while(l<r)
{
mid=(l+r)>>1;
if(a[mid]-a[i]>k)
{
r=mid; // 1 3 5 6 8
}
else
l=mid+1;
}

maxx=max(maxx,l-i);
}
cout<<maxx<<endl;
}
}

 



举报

相关推荐

0 条评论