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

POJ 3258 River Hopscotch

2015-07-20 15:28 477 查看
题意:一条河宽L,中间有n个石头,最多可以去掉m个,求最大的最小跳跃距离。

思路:二分最小值;

二分的两种类型:1求最小的最大值。2求最大的最小值。这个属于第二种。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int L,n,m,a[50010];
bool check(int mid)//检查当前最小值的时候需要去掉的石头数目是否小于m
{
int cnt = 0;
int last = 0;
for(int i = 1; i < n + 2; i++)
if(mid > (a[i] - a[last])) cnt++;
else last = i;
if(cnt > m) return false;
else return true;
}
int main()
{
scanf("%d%d%d",&L,&n,&m);
a[0] = 0;
a[n+1] = L;
for(int i = 1; i <= n; i++)
scanf("%d",&a[i]);
sort(a,a+n+2);
int l = 0, r = L,mid;
while(l < r)//二分最小值
{
mid = (l + r) / 2;
mid += (l + r) & 1;//这个地方是特殊的,求最大的最小需要这样,不然会死循环。
// printf("%d %d %d\n",l,r,mid);
if(check(mid)) l = mid;//不一定是最大的,先留着。
else r = mid - 1;
//system("pause");
}
//printf("%d %d %d\n",l,r,mid);
printf("%d\n",l);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  二分