最小的最大

来源:互联网 发布:使用gson解析json数据 编辑:程序博客网 时间:2024/06/05 12:00

二分答案与高中学习的二分法相类似。对于在区间内单调递增的函数,通过判读f(x)是否满足条件,逐步缩小我们的求解范围。
二分答案的框架大致是

while(l+1<r){    int mid = (l+r+1)/2;    if(judge(mid)){        r = mid;        }else{        l = mid;    }}

此类问题需要注意的是二分的边界问题

二分答案通常可以解决最大情况的最小值(最小情况的最大值)

例题noip2015跳石头
求最小跳跃距离的最大值,设为d
必存在1≤d≤c
进行二分查找,判断每次结果移除的数量是否符合要求

#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int c,m,n,w[50002],mid,l,r;bool judge(int now) {    int flag=0,s=0;    for(int i=1;i<=n+1;i++) {        if(w[i]-s<now) flag++;     //小于now表示需要被移除        else s=w[i];    }    return (flag>m)?false:true;}int main() {    scanf("%d%d%d",&c,&n,&m);    for(int i=1;i<=n;i++) scanf("%d",&w[i]);    l=1;r=c;w[n+1]=c;    while(l+1<r) {         mid=((l+r+1)/2);        if(judge(mid)==false) r=mid;        else l=mid;    }    if(cha(r)) l=r;    printf("%d",l);    return 0;}