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

POJ 3258 River Hopscotch 二分

2012-04-06 16:38 351 查看
题意:奶牛们喜欢在河里的石头上玩跳房子游戏,每次从一个石头跳到另一个石头上。现在知道起点的石头,终点的石头,以及终点石头到起点石头的距离L。又知道起点-终点之间还有N个石头,每个石头到起点的距离记为rock[i]。Farmer John想去掉N个石头中的M个,问如何去掉使得任意两块石头之间的距离的最小值最大。

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

int L, N, M;
int rock[200000];

bool check ( int len )
{
int i, j, cnt = 0;
for ( i = 1; i <= N + 1; i++ )
{
j = i - 1;
while ( i <= N + 1 && rock[i] - rock[j] < len )
{
i++; cnt++;
}
if ( cnt > M ) return false;
}
return true;
}

int bfind ( int left, int right )
{
while ( left + 1 < right ) //放防止出现left = mid的死循环
{
int mid = (left+right)/2;
if ( check(mid) ) left = mid; //始终保持一边的合法性。
else right = mid - 1;
}
if ( check(right) ) return right; //选择最优值,因为right>=left,若right合法,则它更优
else return left;
}

int main()
{
scanf("%d%d%d",&L,&N,&M);
for ( int i = 1; i <= N; i++ )
scanf("%d",&rock[i]);
rock[0] = 0; rock[N+1] = L;
sort(rock,rock+N+2);
int ret = bfind ( 0, L );
printf("%d\n",ret);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: