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