P2249 【深基13.例1】查找 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
二分查找有个比较固定的模板
就是要注意左右变量的范围
#include<iostream>
using namespace std;
int a[1000005];int m;
int halfound(int t)
{
int left=0,right=m-1;
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(a[mid]>=t)
{
right=mid-1;
}
else if(a[mid]<t)
{
left=mid+1;
}
}
if(a[left]==t)
return left;
return -2;
}
int main()
{
int n;
scanf("%d %d",&m,&n);
int t;
for(int i=0;i<m;i++)
{
scanf("%d",&t);
a[i]=t;
}
int ans;
for(int i=0;i<n;i++)
{
scanf("%d",&t);
ans=halfound(t);
printf("%d ",ans+1);
}
}
P1824 进击的奶牛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
二分答案
除了二分模板之外还多了判断条件
judge函数用来判断当前二分解是否合法
合法就继续二分直到最优解
#include<bits/stdc++.h>
using namespace std;
int a[100005];int n,c;
bool judge(int t)
{
int k=0;int last=-1000000000;
for(int i=1;i<=n;i++)
{
if(a[i]-last>=t)
{
last=a[i];
k++;
}
}
return k>=c;
}
int main()
{
scanf("%d %d",&n,&c);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+1+n);
int left=a[1],right=a[n];
int mid;int ans=-111111;
while(left<=right)
{
mid=(left+right)/2;
if(judge(mid))
{
left=mid+1;
ans=max(ans,mid);
}
else
{
right=mid-1;
}
}
printf("%d",ans);
}
P2678 [NOIP2015 提高组] 跳石头 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
也是模板+judge函数
#include<iostream>
using namespace std;
int length,num,mov;int a[50005];
int judge(int m)
{
int last=0;int k=0;
for(int i=1;i<=num+1;i++)
{
if(k>mov)
return 0;
if(a[i]-last<m)
{
k++;
}
else
{
last=a[i];
}
}
if(k>mov)
return 0;
return 1;
}
int main()
{
scanf("%d %d %d",&length,&num,&mov);
for(int i=1;i<=num;i++)
{
scanf("%d",&a[i]);
}
a[num+1]=length;
int left=1;int right=length;
int mid;
while(left<=right)
{
mid=(left+right)/2;
if(judge(mid))
{
left=mid+1;
}
else
{
right=mid-1;
}
}
printf("%d",right);
}