題目描述 陶陶是個貪玩的孩子,他在地上丟了A個瓶蓋,為了簡化問題,我們可以當作這A個瓶蓋丟在一條直線上,現在他想從這些瓶蓋里找出B個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢? 輸入輸出格式 輸入格式: 第一行,兩個整數,A,B。(B<=A<=100000) 第二行,A個整數,分別為這 ...
題目描述
陶陶是個貪玩的孩子,他在地上丟了A個瓶蓋,為了簡化問題,我們可以當作這A個瓶蓋丟在一條直線上,現在他想從這些瓶蓋里找出B個,使得距離最近的2個距離最大,他想知道,最大可以到多少呢?
輸入輸出格式
輸入格式:
第一行,兩個整數,A,B。(B<=A<=100000)
第二行,A個整數,分別為這A個瓶蓋坐標。
輸出格式:
僅一個整數,為所求答案。
輸入輸出樣例
輸入樣例#1: 複製5 3 1 2 3 4 5輸出樣例#1: 複製
2
說明
限時3秒
跟跳石子一樣
直接二分答案即可
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> using namespace std; const int MAXN=1e6+10; const int INF=0x7fffffff; inline char nc() { static char buf[MAXN],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,MAXN,stdin))?EOF:*p1++; } inline int read() { char c=nc();int f=1,x=0; while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();} while(c>='0'&&c<='9'){x=x*10+c-'0',c=nc();} return x*f; } int a[MAXN],n,m; int check(int val) { int now=a[1],nownum=1; for(int i=2;i<=n;i++) if(a[i]-now>=val) now=a[i],nownum++; return nownum>=m; } int main() { #ifdef WIN32 freopen("a.in","r",stdin); #else #endif n=read();m=read(); for(int i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1); int l=0,r=INF,ans=0; while(l<=r) { int mid=(l+r)>>1; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%d",ans); return 0; }