作业介绍

王老师_二分查找+二分答案复习

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int n, a[N];
//a数组是有序的
二分查找的核心思想:用双指针选取一段范围,
然后我们会在这段范围里面寻找最好的答案,
我们每次把范围的中间值和目标值做比较,进行范围的缩小
二分查找 特快
二分查找的特点:思想非常好理解,但是代码细节比较多 + 题型也稍多
//1. 在有序a数组里面查找某个数字有没有出现过
bool erfen1(int x){
	int l = 1, r = n;
	while (l <= r){//一定写的是 l<=r
		int mid = (l + r) / 2;
		if (a[mid] == x) return 1;
		if (a[mid] > x) r = mid - 1;
		if (a[mid] < x) l = mid + 1;
	}
	return 0;
}
6-- > 1 2 2 2 2 4
//2. 在有序a数组里面查找某个数字第一次出现的位置,如果找不到 返回-1
int erfen2(int x){
	int l = 1, r = n, ans =-1;
	while (l <= r){//一定写的是 l<=r
		int mid = (l + r) / 2;
		if (a[mid] == x) ans = mid, r = mid - 1;
		if (a[mid] > x) r = mid - 1;
		if (a[mid] < x) l = mid + 1;
	}
	return ans;
}
//3. 在有序a数组里面查找某个数字最后一次出现的位置,如果找不到 返回-1
int erfen3(int x){
	int l = 1, r = n, ans =-1;
	while (l <= r){//一定写的是 l<=r
		int mid = (l + r) / 2;
		if (a[mid] == x) ans = mid, l = mid + 1;
		if (a[mid] > x) r = mid - 1;
		if (a[mid] < x) l = mid + 1;
	}
	return ans;
}
//结合第二类题型和第三类题型 我们可以快速的计算 某个数字在a数组里面的出现次数
//4.查找大于x的第一个位置,如果没找到返回 -1
int erfen4(int x){
	int l = 1, r = n, ans =-1;
	while (l <= r){
		int mid = (l + r) / 2;
		if (a[mid] > x) ans = mid, r = mid - 1;
		else l = mid + 1;
	}
	return ans;
}
//作用:查找大于x的数据有几个
//5.查找大于等于x的第一个位置,如果没找到返回 -1
int erfen5(int x){
	int l = 1, r = n, ans =-1;
	while (l <= r){
		int mid = (l + r) / 2;
		if (a[mid] >= x) ans = mid, r = mid - 1;
		else l = mid + 1;
	}
	return ans;
}
//作用:查找大于等于x的数据有几个
//6.查找小于x的最后一个位置,如果没找到 返回-1
int erfen6(int x){
	int l = 1, r = n, ans =-1;
	while (l <= r){
		int mid = (l + r) / 2;
		if (a[mid] < x) ans = mid, l = mid + 1;
		else r = mid - 1;
	}
	return ans;
}//作用:查找小于x的数据有多少个
//7.查找小于等于x的最后一个位置,如果没找到 返回-1
int erfen7(int x){
	int l = 1, r = n, ans =-1;
	while (l <= r){
		int mid = (l + r) / 2;
		if (a[mid] <= x) ans = mid, l = mid + 1;
		else r = mid - 1;
	}
	return ans;
}//作用:查找小于等于x的数据有多少个
//组合技:
int main(){

	return 0;
}
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
//每棵树的高度是在  1到1e9
//答案的范围是在??? 0 到 1e9 
// 我们要在答案的范围内 找到一个最优的答案
// 0 1 2 3 4 5 6 --  5e8 ---  1e9
long long a[N],n,m;
bool check(int x){//检测 砍伐高度为x的时候是否可行 可行的话返回1 不可行返回0
    int ans=0;
    for(int i=1;i<=n;i++){
        if(a[i]>x){
            ans+=a[i]-x;
        }
    }
    if(ans>=m) return 1;
    else return 0;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    int l=0,r=1e9,ans=-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(check(mid)==1){
            ans=mid;
            l=mid+1;
        }else{
            r=mid-1;
        }
    }
    cout<<ans;
    return 0;
}

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
12
开始时间
2025-12-15 0:00
截止时间
2026-1-10 23:59
可延期
24 小时