思路:二分答案,check一下每次二分的mid
假设每次砍的高度为mid,那么所能得到的木材长度为 ,去和M比一下,大于等于的话左界可以右移,小于的话,右界左移
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
using namespace std;
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define pb push_back
#define IOS ios::sync_with_stdio(false)
#define int long long
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
typedef long long ll;
const int N=1e6+2;
int n,m;
ll maxn;
int a[N];
bool check(int mid)
{
ll res=0;
_for(i,1,n)
{
res += (mid>=a[i]?0:a[i]-mid);
}
return res >= m;
}
void solve()
{
int l=0,r=maxn;
while( l<=r )
{
int mid=(l+r)>>1;
if( check(mid) ) l=mid+1;
else r=mid-1;
}
cout<<r<<endl;
}
signed main()
{
///!!!
// freopen("data.txt","r",stdin);
//!!!
IOS;
cin>>n>>m;
_for(i,1,n)
{
cin>>a[i];
maxn=max(maxn,a[i]);
}
solve();
}