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