题目概况
题目链接: https://www.luogu.com.cn/problem/P1873
难度: 普及/提高-,高了(确信
题目分析
简化题目: 简洁至极
涉及知识点: 二分答案
解题思路:
一个裸的二分答案板子题
代码拆解及要点分析
有一点需要提醒:
我们在统计当前高度可以得到多长的木材时,需要判断当前这棵树的高度是否大于mid
,要不然会有负数。
完整代码
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int MAXN = 1e6 + 5;
ll n, m, ans, maxn;
ll a[MAXN];
int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
maxn = max(maxn, a[i]);
}
int l = 1, r = maxn;
while (l <= r) {
int mid = (l + r) / 2;
ll sum = 0;
for (int i = 1; i <= n; i++) {
if (a[i] >= mid) { //判断能不能砍到
sum += a[i] - mid;
}
}
if (sum < m) { //如果得不到那么多,就说明举高了
r = mid - 1;
} else { //得到大于等于m的木材,我们可以尝试再举高一点
l = mid + 1;
ans = mid;
}
}
cout << ans << endl;
return 0;
}