您的位置:首页 > 运维架构

pku 3258 River Hopscotch

2009-10-07 16:04 113 查看
3258 River Hopscotch acm.pku.edu.cn/JudgeOnline/problem

/*
用二分法查找,求得最适合的key值。
0--l之间有N个石头,删除M个,使得任意两个石头之间的距离增大,并且求出增大后的最小距离的最大值。不考虑起点和终点。
起点为0 ,终点为l.
如果M==0就输出距离的最大值!
Sample Input
25 5 2
2
14
11
21
17
Sample Output
4

*/

#include <cstdio>
#include <algorithm>
using namespace std;

long int l,n,m,d[50005];

bool judgement(int mid)
{
int pf,num,i;/*pf==0表示是起点*/
pf=0;
num=0;
for(i=0;i<n;i++)
{
if(d[i] - pf < mid) num++; /*可以想象成距离为mid,小于mid的边不加入,大于或者等于的加入其中,并且以加入的点作为下一条边的起点*/
else pf = d[i];
}
if(l - pf < mid) num++; /*终点将不再作为起点*/

if(num <= m) return true; /*返回true,如果num<m表示mid还可以更大一些,=m表示也许就是这个mid,但是也有扩展的空间*/
else return false;/*表示mid应该更小一些才能满足条件*/
}

int sloveproblems()
{
long int min,max,keyword,i,mid;

for(i=0;i<n;i++)
scanf("%ld",&d[i]);
sort(d,d+n);
if(n==0){ printf("%d/n",l); return 0;}

min=0;
max=l;
keyword=0;
while(min<=max)/*二分法求key值*/
{
mid = ( min + max )/2;
if(judgement(mid))
{
keyword = mid;
min = mid + 1;
}
else max = mid - 1;
}
printf("%ld/n",keyword);
}

int main()
{
while(scanf("%ld%ld%ld",&l,&n,&m)!=EOF)
{
sloveproblems();
}
return 0;
}

wrong了我好几次,最后还是看了别人的二分法过的!哎~要努力啊!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: