[洛谷 P1316] 丢瓶盖

题目传送门

题意简述:

给定n,m,以及n个距离值a[i]表示给定n个点以及它的距离值,要求选出m个,使得距离最近的两个距离值最大,求出最大值

思路:

因为每个点的距离值确定,所以最近距离的最大值具有单调性,随m增加而减小,二分这个最大值,看能否满足要求选出m个的情况,更新最值

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=2e5+10;
int n,m,ans;
int a[maxn];
inline int read(){
    int x=0,f=1;char ch=getchar();
    while(!isdigit(ch)) f=(ch=='-')?-1:1,ch=getchar();
    while(isdigit(ch)) x=x*10+(ch-'0'),ch=getchar();
    return x*f;
}
inline bool judge(int p){
    int cnt=1,la=1;
    for(int i=2;i<=n;i++)
        if(a[i]-a[la]>=p) cnt++,la=i;
    if(cnt>=m) return true;
    else return false;
}
signed main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++) a[i]=read();
    sort(a+1,a+1+n);
    int l=1,r=1e9,mid;
    while(l<=r){
        mid=(l+r)/2;
        if(judge(mid)) l=mid+1,ans=max(ans,mid);
        else r=mid-1;
    }
    cout<<ans<<'\n';
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wyctstf/p/11616647.html