HDU 4004 - The Frog\'s Games 第36届ACM/ICPC亚洲大连赛区网络赛

来源:互联网 发布:1024程序员节 编辑:程序博客网 时间:2024/04/30 02:41
         这是第36届ACM/ICPC亚洲大连赛区网络赛的题目,题目就是说青蛙要跳过一条宽为L的河流,最多能跳m次,河中共有n块石头,每块石头距河岸的距离分别为n1,n2,……,nn,要求出青蛙一次至少能跳多远才能跳过河;
这样需要找到这些石头的距离之间最大值,青蛙一次能跳的距离应该介于这个最大值和河流宽度L之间;可以用二分来求解;

code:
#include<cstdio>
#include<algorithm>
using namespace std;
int d[500001];
int l;
int calculate(int x)       //计算出当距离为x时,至少需要多少步
{
    int n=0,count = 0,p=0;
    while(now<l)
    {
        n+=x;
        while(n>=d[p+1])p++;
        n=d[p];
        count ++;
    }
    return count;
}
int main()
{
    int n,m;
    while(scanf(\"%d%d%d\",&l,&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)
        scanf(\"%d\",&d[i]);
        sort(d+1,d+n+1);
        d[0]=0;d[n+1]=l;
        d[n+2]=2147483647;
        int min=0;
        for(int i=1;i<=n+1;i++)
        {
            if(min<d[i]-d[i-1])
            min=d[i]-d[i-1];
        }
        int left=min,right=l;
        int res;
        while(left<=right)  //二分查找
        {
            int mid=(left+right)/2;
            if(calculate(mid)<=m)
            {
                res=mid;
                right=mid-1;
            }
            else
            left=mid+1;
        }
        printf(\"%d\\n\",res);
    }
    return 0;
}