这道题是一道典型的二分。
思路:找到其中的最高的一颗树,对其二分。每次判断mid高度的时候,所有数目的截距之和是否大于等于需要的木长M,如果是大于等于,那就记录下此时的高度,一直循环,直到top<bottom为止,下面是AC代码:
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long int ll;
int main()
{
ll N,M;
cin>>N>>M; //总共有N棵树要得到M米长的木头
ll a[N+1];
for(int i=1;i<=N;i++)
{
cin>>a[i];
}
ll top= *max_element(a+1,a+N+1);
ll bottom=0;
ll mid;
ll res;//记录切割正确的距离
while(bottom<=top)
{
ll sum=0;
mid=(bottom+top)/2;
for(int i=1;i<=N;i++)
{
if(a[i]>mid)
{
sum+=a[i]-mid;
}
}
if(sum>=M)
{
res=mid;
bottom=mid+1;
}
else
{
top=mid-1;
}
}
cout<<res<<endl;
return 0;
}