题目链接
链接: P1873 [COCI 2011/2012 #5] EKO / 砍树
题目描述
解题思路
二分查找寻找右端点模板,可以看这篇博客 Acwing 二分查找复习 两种模板的比较和使用场景
,需要注意的是这里是H越大反而砍的树越少所以check函数如下
bool check(LL height)
{
LL length = 0;
_for(i, 0, n) {
if (a[i] < height) continue;
else {
length += (a[i] - height);
}
}
return length >= m ? true : false;
}
代码实现
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<deque>
#include<numeric>
#include<cmath>
#define _for(i,a,b) for(int i=(a);i<(b);i++)
#define _rep(i,a,b) for(int i=(a);i<=(b);i++)
typedef long long LL;
using namespace std;
const int N = 2000001;
LL a[N], n, m, s[N], q = 0;
bool check(LL height)
{
LL length = 0;
_for(i, 0, n) {
if (a[i] < height) continue;
else {
length += (a[i] - height);
}
}
return length >= m ? true : false;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
_for(i, 0, n) {
cin >> a[i];
q = max(a[i], q);
}
int l = 1, r = q - 1;
while (l < r)
{
LL mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << l;
return 0;
}
总结
巩固二分查找技巧