Balanced Stone Heaps -

 

分析:

        二分最大的最小值,check每次可以从n向3反向遍历,如果石头数大于等于mid,那么可以存在两种情况,可以是从后面的几堆传递过来后的石头数,也可以是这一堆本身初始的石头数,这一堆最多可以向前传递的石头是本身石头数sum减去mid,才能保证整体最小是mid,题目要求是从前往后遍历,因此最多向前转移初始石头数量,最后判断转移到前两堆的石头数是否都满足大于等于mid。

代码:

#include 

using namespace std;

typedef long long ll;
typedef pair pii;

const int N=2e5+10;

ll a[N];
ll b[N];
int n;

bool check(ll mid)
{
	for(int i=0;i1;i--)
	{
		if(b[i]=mid&&b[1]>=mid);
}

int main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);

	int _;
	cin>>_;
	while(_--)
	{
		cin>>n;
		ll maxn=0;
		for(int i=0;i>a[i];
			maxn=max(maxn,a[i]);
		}
		ll l=0;
		ll r=maxn;
		while(l

你可能感兴趣的:(算法,c++,二分,思维)