习题:砍树(二分)

题目

传送门

思路

很明显的一道二分板子题。。。

代码

#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;
}
posted @ 2019-10-22 20:27  loney_s  阅读(101)  评论(0)    收藏  举报