周测之拔河问题

在这里插入图片描述
第一个方法
二分查找,对数组从小到大排序,对于每个a(i),二分出满足a(j)-a(i)<=5的最右位置j,用j-i+1更新答案

//二分
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxm=2e6+5;
int a[maxm];
int n;
signed main(){
    
    
int n;cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
int ans=0;
for(int i=1;i<=n;i++){
    
    
int l=i,r=n;
int pos=i;
while(l<=r){
    
    
int mid=(l+r)/2;
if(a[mid]-a[i]<=5)pos=mid,l=mid+1;
else r=mid-1;
}
ans=max(ans,pos-i+1);
}
cout<<ans<<endl;
return 0;
}

贪心算法

#include <bits/stdc++.h>
#define IOF ios_base::sync_with_stdio(false)
using namespace std;
const int N = 200005;
int a[N], n, minn, maxx;

inline bool cmp(const int &a, const int &b){
    
     return a < b; }

int main(){
    
    
    IOF;
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    sort(a, a + n, cmp);
    int ans = 0;
    while (maxx <= n){
    
    
        if (maxx - minn > ans) ans = maxx - minn;
        if (maxx == n) break;
        if ((a[maxx] - a[minn]) <= 5) maxx++;
        else minn++;
    }
    cout << ans << endl;
    return 0;
}


猜你喜欢

转载自blog.csdn.net/wuyvle/article/details/113760206