蓝桥杯专项复习——二分
二分查找、二分答案基础知识
二分查找模版
【模版题】数的范围
输入样例
6 3
1 2 2 3 3 4
3
4
5
输出样例
3 4
5 5
-1 -1
思路:
对应两个模版,起始位置是对应第一个模版,即后面的都符合
终止位置对应第二个模拟,即前面的符合
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100000+10;
int a[N];
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,q;cin>>n>>q;
for(int i=0;i<n;i++)
cin>>a[i];
while(q--)
{
int x;cin>>x;
int l=0,r=n-1;
while(l<r)//查找起始位置,右边符合
{
int mid=(l+r)/2;
if(a[mid]>=x)
r=mid;
else
l=mid+1;
}
if(a[l]!=x)//不存在
cout<<"-1 -1"<<endl;
else//查找终止位置
{
cout<<l<<' ';//将起始位置输出
l=0,r=n-1;
while(l<r)
{
int mid=(l+r+1)/2;
if(a[mid]<=x)
l=mid;
else
r=mid-1;
}
//不用再判断是否存在
//输出终止位置
cout<<l<<endl;
}
}
return 0;
}
借教室
输入样例1
4 3
2 5 4 3
2 1 3
3 2 4
4 2 4
输出样例1
2
说明1
第一份订单满足后,这四天剩余的教室数为{0,3,2,3}
第二份订单要求第二天到第四天每天提供3个教室,而第三天剩余的教室数为 2,
因此无法满足。分配停止,通知第二个申请人修改订单。
输入样例2
4 1
2 5 4 3
2 1 3
输出样例2
0
思路: