二分答案_排序_1873_E. Building an Aquarium

#include

using namespace std;

const int N=2e5+10;

int a[N];

int n;

long long find(int x)
{
	long long ans=0;
	for(int i=0;i<n;i++)
		if(a[i]<=x)
			ans+=x-a[i];
	
	return ans;
}

void solve()
{
	int x;
	cin>>n>>x;
	
	for(int i=0;i<n;i++)
		cin>>a[i];
	
	sort(a,a+n);
	
	int l=0,r=x;
	while(l<r)
	{
		int mid=l+r+1>>1;
		if(find(mid)<=x)
			l=mid;
		else
			r=mid-1;
	}
	cout<<l<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

算是一个比较经典的二分,但是我只能过部分样例

找了一份题解,发现把自己的左右端点取一个比较大的值,然后用 long long 就可以过掉该题

二分答案比较明显是因为要寻找一个比某个答案小的最大值,该题是要寻找一个比可以使用的水量小的最大高度

#include

using namespace std;

const int N=2e5+10;

int a[N];

int n;

long long find(long long x)
{
	long long ans=0;
	for(int i=0;i<n;i++)
		if(a[i]<=x)
			ans+=x-a[i];
	
	return ans;
}

void solve()
{
	int x;
	cin>>n>>x;
	
	for(int i=0;i<n;i++)
		cin>>a[i];
	
	sort(a,a+n);
	
	long long l=0,r=1e10;
	while(l<r)
	{
		long long mid=l+r+1>>1;
		if(find(mid)<=x)
			l=mid;
		else
			r=mid-1;
	}
	cout<<l<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

二分的模板可以看我之前写的博客,l 取 mid 的时候要加一,中点在要求的值的左边,要更新左端点

你可能感兴趣的:(#,1100,算法,数据结构)