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;
}

posted @ 2024-07-17 17:15  书面  阅读(63)  评论(0)    收藏  举报