1 条题解

  • 0
    @ 2026-2-4 14:15:35
    #include<bits/stdc++.h>
    using namespace std;
    
    // [1] 全局变量:n表示树木的数量,m表示需要获取的木材总长度
    int n,m;
    // [2] 存储每棵树高度的数组,数组大小满足题目中n最大为1e6的要求
    int arr[1000100];
    
    int main(){
        // [3] 输入树木数量n和需要的木材总长度m
        cin>>n>>m;
        // [4] 循环输入每棵树的高度,存入数组arr
        for(int i=1;i<=n;i++){
        	cin>>arr[i];
    	}
    	
    	// [5] 对树木高度数组进行升序排序,为后续二分查找做准备
    	sort(arr+1,arr+n+1);
    	
    	// [6] 初始化二分查找的边界:left为最小可能高度1,right为最高树木的高度;max_high记录满足条件的最大高度
    	int left=1,right=arr[n],max_high=0;
    	
    	// [7] 二分查找主循环:寻找能获取至少m米木材的最大切割高度
    	while(left<=right){
    		// [8] 计算当前二分的中间高度mid,使用left+(right-left)/2避免直接相加溢出
    		int mid=left+(right-left)/2;
    		
    		// [9] 计算当前mid高度下,所有树木能提供的木材总长度
    		int sum=0;
    		for(int i=1;i<=n;i++){
        		sum+=max(0,arr[i]-mid);  // [10] 单棵树贡献的木材:高度超过mid的部分,不足则为0
        		if(sum>=m) break;  // [11] 提前终止循环:若当前累计木材已满足需求,无需继续计算
    		}
    		
    		// [12] 判断当前mid高度是否满足木材需求
    		if(sum>=m){
    			max_high=mid;  // [13] 记录当前可行的最大高度
    			left=mid+1;    // [14] 尝试更高的高度,调整左边界
    		}else{
    			right=mid-1;   // [15] 当前高度过高,无法满足需求,调整右边界
    		}
    		
    	}
    	
    	// [16] 输出满足条件的最大切割高度
    	cout<<max_high;
        return 0;                  
    }
    
    • 1

    信息

    ID
    1224
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    2
    已通过
    1
    上传者