トピック:
ファーマージョンはNNを含む長い囲い、(2 <= N <=内蔵 10万) 区画は、これらのキュービクルは番号付けされ、X1、...、XN(0 < = XI <10億(1,000,000,000))。 しかし、 、C(2 <= C <=のジョン・ N) の区画にレイアウト好きではない、と牛の数頭の牛、彼らは戦闘が発生します。牛を維持するためには、お互いを傷つけます。ジョンは、牛にできるだけ大きく任意の二つの牛の間の最小距離を独自の区画を割り当てることを決め、その後、最大最小距離は、それは何である
入力
二つの整数N及びCスペースで区切られた最初の行
二列- N + 1行目:I + 1つのXI線の位置を示す
出力を最初のライン:整数、最大の最小値
入力サンプル
5 3
1
2
。8
。4
。9
出力例
3頭の
この最小距離の牛は、3である4,8
方法:中間体を見つけるために(半ば、R&LT]で条件を満たすために、現在のトピックが中間できる場合、その後、遠い半分この答えを第一の区画との間の距離を与えるために区画をソートし、区画手紙は見つけること[リットル、ミッド)を行っていない場合。
コード:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,c,a[100010];
int check(int x)
{
int t=a[1],ans=1;
for (int i=2;i<=n;i++)
{
if (a[i]-t>=x)
{
ans++;
t=a[i];
}
}
if (ans>=c) return 1;
else return 0;
}
int main()
{
cin>>n>>c;
for (int i=1;i<=n;i++)
scanf("%d",a+i);
sort(a+1,a+1+n);
int l=0,r=a[n]-a[1],mid,ans;
while (l<=r)
{
mid=(l+r)/2;
if (check(mid))
{
l=mid+1;
ans=mid;
}
else
{
r=mid-1;
}
}
cout<<ans;
}