天天看點

二分答案易錯點

最近在寫二分搜尋和二分答案的題目,二分搜尋一般用内置函數即可,二分答案一般都得自己寫搜尋算法,然而我們所求的答案不是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;
}