POJ 3258 River Hopscotch

来源:互联网 发布:拼接图片软件台词 编辑:程序博客网 时间:2024/06/07 03:55

题意:起始石头和终止石头之间的距离是l,在起始石头和终止石头之间有n块石头,并且已经给出这n块石头分别到起始石头的距离,去掉最多不超过m块石头使两块石头之间的最小距离最大,输出这个距离

解题思路:最大化最小值二分法,将石头到初始石头的距离存入数组,二分求两块石头之间的最小距离的最大值,判断当前的距离x是否符合条件,如果两块石头之间的距离小于x就去掉右边的石头,最后还要判断一下第n块石头到终止石头的距离

代码:

#include <iostream>#include <algorithm>#include <string>#include <cstring>#include <cstdio>using namespace std;#define INF 0x3f3f3f3fint d[50005];int l,n,m;bool judge(int x){    int del=0,k=0;    for(int i=0; i<n; i++)    {        if(d[i]-k<x)del++;        else k=d[i];    }    if(l-k<x)del++;//这步很重要,判断第n块石头到终止石头的距离    if(del>m)return false;    return true;}int main(){    cin>>l>>n>>m;    memset(d,0,sizeof(d));    for(int i=0; i<n; i++)    {        cin>>d[i];    }    sort(d,d+n);    int lb=0,ub=INF;    while(ub-lb>1)    {        int mid=(lb+ub)/2;        if(judge(mid))lb=mid;        else ub=mid;    }    cout<<lb<<endl;    return 0;}



原创粉丝点击