hdu 4004

来源:互联网 发布:网络工作 编辑:程序博客网 时间:2024/06/01 07:18

转自:

http://blog.csdn.net/non_cease/article/details/6769814

题目大意:
见题目描述;

基本思路:

二分跳的距离;然后从头扫到尾,n*logn的时间复杂度;(注意,细节处理十分重要可以视为一种技巧

题目描述:

#include<iostream>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<stack>
#include<list>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 500000+10;
int stone[maxn];
int length,number,times;


bool judge(int x)
{
    if(x*times<length) return false;
    int i=0,cnt=0;
    for(int j=1;j<=number+1;j++)
    {
        if(stone[j]-stone[i]>x)
        {
            if(j==i+1)  return false;
            else
            {
                i=--j;//**************非常重要,找到跳的石头编号后,立即让j退回来比i大一个编号,防止出现相邻距离的差值大于x却漏判的情况;
                cnt++;
            }
        }
    }
    if((++cnt)>times) return false;
    else return true;
}
int main()
{
    while(scanf("%d%d%d",&length,&number,&times)==3)
    {
        stone[0]=0;//好技巧,把两岸的情况变为数组元素,方便判断,以后类似的题目学着这么做;
        for(int i=1;i<=number;i++)
        {
            scanf("%d",&stone[i]);
        }
        stone[number+1]=length;
        sort(stone,stone+number+2);
        int left=0,right=length+1,middle;
        while(right>left)
        {
            middle=left+(right-left)/2;
            if(judge(middle)) right=middle;
            else left=middle+1;
        }
        printf("%d\n",left);
    }
    return 0;
}

原创粉丝点击