习题:砍树(二分)
题目
思路
很明显的一道二分板子题。。。
代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define int long long
int n,m;
int l,r,mid;
vector<int> v;
bool check(int x)
{
int s=0;
for(int i=v.size()-1;i>=0;i--)
{
if(v[i]>=x)
{
s+=(v[i]-x);
if(s>=m)
return 1;
}
else
break;
}
return 0;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
r=max(x,r);
v.push_back(x);
}
sort(v.begin(),v.end());
while(l+1<r)
{
mid=(l+r)/2;
if(check(mid))
{
l=mid;
}
else
{
r=mid;
}
}
while(check(mid))
mid++;
cout<<mid-1;
return 0;
}

浙公网安备 33010602011771号