Codeforces Round 898 (Div. 4) E. Building an Aquarium题解
题目:
您喜欢鱼,所以决定建一个水族馆。您有一块由 n根柱子组成的珊瑚,其中 i根柱子的高度为 ai个单位。之后,您将围绕珊瑚建造一个水箱,如下所示:
选择一个整数 h≥1— 水箱的高度。在水箱两侧建造高度为 h的墙壁。然后,将水箱装满水,使每根柱子的高度为 h,除非珊瑚的高度高于 h;否则不应向此柱子添加水。
例如,对于 a=[3,1,2,4,6,2,5]和高度 h=4,您最终将使用总共 w=8个单位的水,如图所示。

您最多可以使用 x个单位的水来填满水箱,但您想建造尽可能最大的水箱。您可以选择的 h的最大值是多少?
输入
第一行包含一个整数 t( 1≤t≤104) — 测试用例的数量。
每个测试用例的第一行包含两个正整数 n和 x( 1≤n≤2⋅105; 1≤x≤109 ) — 珊瑚的柱数和可以使用的最大水量。
每个测试用例的第二行包含 n个空格分隔的整数 ai( 1≤ai≤109) — 珊瑚的高度。
所有测试用例的 n之和不超过 2e5
输出
对于每个测试用例,输出一个正整数 h( h≥1) — 水箱的最大高度,因此最多需要 x个单位的水才能填满水箱。我们有一个证明,在这些约束条件下, h这个值始终存在。
测试样例

题目链接https://codeforces.com/contest/1873/problem/E
分析:首先题目要求水箱尽可能大即要求h最小 但求得是h的最大值 即h的最小值最大是多少 很明显本题可以使用二分答案解决
然后分析h的范围h最小即是1 最大即是2e9(珊瑚最高1e9+水量最多1e9 = 2e9)
确定了答案h的范围之后 直接可以写二分模板了.
代码
#include <bits/stdc++.h>
using namespace std;
#define LL long long
const int N = 2e5+10;
int t;
int n,x;
int a[N];
bool check(LL mid)
{
LL cnt = 0;
for(int i = 1;i<=n;i++)
{
if(a[i]<mid)cnt+=mid-a[i];
if(cnt>x)return false;
}
return true;
}
void solve()
{
cin>>n>>x;
for(int i = 1;i<=n;i++)cin>>a[i];
LL l=1,r=2e9+10;
while(l<r)
{
LL mid = r+l+1>>1;
if(check(mid))l=mid;
else r=mid-1;
}
cout<<l<<"\n";
}
int main()
{
cin>>t;
while(t--)solve();
return 0;
}

浙公网安备 33010602011771号