二分答案易错点

最近在写二分搜索和二分答案的题目,二分搜索一般用内置函数即可,二分答案一般都得自己写搜索算法,然而我们所求的答案不是middle,因为在最后一个循环的时候,可能middle不符合答案,所以必须在每一个符合答案的情况下,把middle赋值给一个变量,这个变量就是我们要求的答案,在二分答案结束的时候,我们只需要输出这一个答案即可

下面发个二分答案的题目链接https://www.luogu.com.cn/problem/P3853,只要用我上面的思想就可以解决

下面附上ac代码

 

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
using namespace std;




bool cmp(long long x,long long y)
{
    return x>y;
}

int main()
{
    long long l,n,k;
    scanf("%lld%lld%lld",&l,&n,&k);
    long long a[n+1];
    for(register long long i=0;i<n;i++)
        scanf("%lld",a+i);
    
    // 最末端特殊处理 
    a[n] = l - a[n-1];
    // 0端不处理 
     for(register long long i=n-1;i>0;i--)
         a[i] = a[i] - a[i-1];
     
     sort(a,a+n+1,cmp); 
     
     /*for(register long long i=0;i<=n;i++)
        printf("%lld\n",a[i]);*/
        
        
    long long left=0,right=l,middle=0,tempk,jieguo;
    while(left<=right)
    {
        middle = (left+right)/2;
        tempk = k;
        for(register long long i=0;i<=n;i++)
        {
            if(a[i]>=middle)
            {
                tempk -= a[i]/middle;
                if(a[i]%middle==0)
                {
                    tempk++;
                }
            }
            
        }
        // 间隔太小 
        if(tempk<0)
        {
            left = middle + 1;     
        }
        else
        {
            jieguo = middle;
            right = middle - 1; 
        }
    }
    printf("%lld",jieguo);


    
    // printf("%lld",q[0]);
    return 0;
} 

 

posted @ 2021-08-19 04:06  小兜兜me  阅读(50)  评论(0编辑  收藏  举报