poj 2456
// n点中选c点放下c头牛 是的n-1段距离中的最短距离最大 ,求这个最大的最短距离
//假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,
//就先让x变大再判断;如果放不下,说明当前的x太大了,
//就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。
# include <algorithm>
# include <string.h>
# include <stdio.h>
using namespace std;
int n,c,i,a[100010];
int judge(int x)
{
int cot=1;
int tmp=a[0];
for(i=1;i<n;i++)
{
if(a[i]-tmp>=x)//距离大于栏的间隙 可以放下
{
cot++;
tmp=a[i];
if(cot>=c)//可以排下c头牛
return true;
}
}
return false;
}
int slove()//二分查找
{
int l=0;//最小距离
int r=a[n-1]-a[0];//最大距离
while(l<=r)
{
int mid=(l+r)/2;
if(judge(mid))//可以排下c头牛
l=mid+1;
else
r=mid-1;
}
return l-1;
}
int main()
{
while(~scanf("%d%d",&n,&c))
{
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
printf("%d\n",slove());
}
return 0;
}
poj 3258
include <algorithm>
# include <stdio.h>
# include <string.h>
using namespace std;
int n,m;
int a[50010];
int slove(int x)
{
int cot=0;
int tmp=a[0];
for(int i=1;i<=n;i++)
{
if(a[i]-tmp>=x)
{
cot++;
tmp=a[i];
if(cot>=(n-m))
return true;
}
}
return false;
}
int main()
{
int L,i;
while(~scanf("%d%d%d",&L,&n,&m))
{
memset(a,0,sizeof(a));
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a,a+n+1);
if(n==m)
{
printf("%d\n",L);
continue;
}
int l=0;
int r=L;
while(l<=r)
{
int mid=(l+r)/2;
if(slove(mid))
l=mid+1;
else
r=mid-1;
}
printf("%d\n",l-1);
}
return 0;
}