hdu 4004 最大值最小化

来源:互联网 发布:可牛软件官方下载 编辑:程序博客网 时间:2024/04/30 08:00

http://acm.hdu.edu.cn/showproblem.php?pid=4004

一条线段长度为L,线段上有n个点,最多选取 m-1 个点,使得包括线段端点在内的相邻点之间的最大距离值最小。

最大值最小化问题,显然二分

judge每次选最远点,选出点数不超过m即可

#include <iostream>#include <cstdio>#include <cstring>#include <string.h>#include<queue>using namespace std;int st[500010],len,n,m,i,j,maxx,fuck,x,flag,left,right,mid;bool judge(int cao){    int dis = 0, count = 1, i;    if(st[0] - dis > cao)        return 0;    for(i = 1; i <= n; i++)    {        if(st[i] - dis > cao)        {            dis = st[i-1];            if(st[i]-dis > cao)                return 0;            count++;        }    }    if(count > m)        return 0;    return 1;}int main(){    while(~scanf("%d%d%d",&len,&n,&m))    {    memset(st,0,sizeof(st));    for(i = 1;i <= n;i++) scanf("%d",&st[i]);    sort(st,st+n+1);    n++;    fuck = n - m;    st[n] = len;    int left = 0,right = len;    while(left < right)    {        mid = (left + right)/2;        if(judge(mid)) right = mid;        else left = mid+1;    }    printf("%d\n",right);    }    return 0;}


0 0
原创粉丝点击