Contest1122 - [C3]二分答案-安阳二四六下午

2023-07-22 12:00:00
2023-08-31 16:00:00
已结束 公开 当前时间:2024-09-20 13:48:12
题目编号 标题
A【入门】二分查找
B【入门】二分查找左侧边界
C【入门】二分查找右侧边界
D【入门】二分查找满足条件的数
E【基础】同时出现的数
F【基础】最满意的方案
G【提高】小X算排名
H【基础】伐木工
I【提高】跳石头
J【基础】最小的空旷指数
K【提高】买木头
L【基础】愤怒的奶牛
M木桶效应

信息与公告

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000001];
//存在时   返回的下标:最左边的x的下标 
//不存在时 返回的是第一个大于x的下标 
//返回第一个>=x的位置 可能越界 想象右侧有无穷大的边界 
int findLeft(int x){
	int L=1,R=n; 
	while(L<=R){
		int mid=(L+R)/2;
		if(x<=a[mid]){//相等 往左找 
			R=mid-1;
		}else{
			L=mid+1;
		}
	}
	return L;//返回L 
}
//返回最后一个<=x的 R  最左边有无穷小的边界 
int findRight(int x){
	int L=1,R=n; 
	while(L<=R){
		int mid=(L+R)/2;
		if(x<a[mid]){
			R=mid-1;
		}else{
			L=mid+1;//相等 往右找 
		}
	}
	return R;//返回R
}

int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	cin>>m;//要查找的次数  
	while(m--){
		int x;
		cin>>x;
		int L=findLeft(x);
		int R=findRight(x);
		cout<<"findLeft 返回的L:"<<L<<endl;
		cout<<"findRight 返回的R:"<<R<<endl;
		
	}
	
	return 0;
} 
//(L+R)/2 左:R=mid-1;  右:L=mid+1;
//6
//1 2 2 3 3 3