1 条题解
-
0
#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
- 上传者