Base Station Sites
时间限制: 1 Sec 内存限制: 128 MB提交: 214 解决: 86
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
输入
Each set starts with a line which specifies L (i.e., the number of candidate locations) and S (i.e., the number of base stations). The next line contains L space-separated integers which represent P1, P2,..., PL.
The input data ends “0 0”.
输出
样例输入
5 3
2 3 9 6 11
4 3
1 4 9 10
0 0
样例输出
4
3
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
using namespace std;
const int N = 1e5 + 10;
int S,L,a[N];
int main()
{
while(scanf("%d%d",&L,&S)&&L+S)///输入候选位置的数量,基站的数量
{///并且l和s为0时结束输入
for(int i=0; i<L; i++) scanf("%d",&a[i]); ///可能选中的位置
sort(a,a+L);///从小到大排序,便于寻找位置
int l = 0, r = 1e6,mid;///左面,右面,中间
while(l<=r)///当左面小于右面时进行循环
{
mid = (l+r)>>1;///中间等于左右和的一半
int cnt = 1, now = 0;///now记录当前位置,cnt表示可以放置基站的数量
for(int i=1; i<L; i++)///遍历候选位置
{
if(a[i]-a[now]>=mid)///如果两者之间距离大于mid的话
{
now = i;///更新当前位置
cnt++;///可建立基站数+1
}
}
if(cnt>=S) l = mid + 1;///如果可建立基站数大于s,说明距离小了,调大距离
else r = mid - 1;///否则,调小距离
}
printf("%d\n",r);///或者l-1;
}
return 0;
}