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