cf round 898 (div.4) E

建造水族馆

题目描述

你喜欢鱼,所以你决定建造一个水族馆。你有一块由 n 根柱子组成的珊瑚,其中 i 根柱子高 ai 个单位。之后,你将在珊瑚周围建造一个水族箱,具体如下:

  • 选择一个整数 h --水箱的高度。在水箱两侧建造高度为 h 的墙壁。
  • 然后,在水箱中注满水,使每一列的高度都是 h ,珊瑚的高度超过 h 这一列就不能注水

例如, a=[3,1,2,4,6,2,5] ,高度为 h=4 ,最终总共需要使用 w=8 个单位的水,如图所示。

你最多可以用 x 个单位的水来装满水箱,但你想尽可能建造最大的水箱。你能选择的 h 的最大值 是多少?

输入

第一行包含一个整数 t( 1 <= t <= 10 4 ) - 测试用例数。

每个测试用例的第一行包含两个正整数 nx( 1 <= n <= 2 * 105 ; 1 <= x <= 109 )--珊瑚的列数和最大水量。

每个测试用例的第二行包含 n 个空格分隔的整数 ai ( 1 <= a1 <= 109; 1 <= x <= 109 )。( 1 <= ai <= 109) - 珊瑚的高度。

所有测试用例中 n 的总和不超过 2 * 105

输出

对于每个测试用例,输出一个正整数 h ( h >= 1 ) - 水箱的最大高度,因此最多需要 x 个单位的水才能装满水箱。

我们已经证明,在这些限制条件下, h 这个值总是存在的。

测试样例

输入

5
7 9
3 1 2 4 6 2 5
3 10
1 1 1
4 1
1 4 3 4
6 1984
2 6 5 9 1 8
1 1000000000
1

输出

4
4
2
335
1000000001

样例解释

第一个测试案例如语句所示。在 h=4 的情况下,我们需要 8 单位的水,但如果将 h 增加到 5 ,我们需要13 单位的水,这比 x=9 多。所以 h=4 是最佳方案。

在第二个测试案例中,我们可以选择 h=4 ,并在每列中添加 3 个单位,总共使用 9 个单位的水。可以证明这是最佳方案。

在第三个测试案例中,我们可以选择 h=2 ,并使用所有的水,因此这是最优方案。

易错

上边界是珊瑚最大高度和最大水量高度的总和,并非只是最大水量的高度,所以r初始化为2e9 + 10,而不是1e9 + 10

  • 样例5 则说明了这一点,只有一个珊瑚,结果就是最大水量和珊瑚高度加在一起

代码

#include <iostream>

const int N = 2e5 + 10;
long long a[N];
using namespace std;

int main()
{
    int t; cin >> t;
    while(t--)
    {
        int n, x;
        long long max = 0;
        cin >> n >> x;
        for(int i = 0; i < n; i++) cin >> a[i];
        long long l = 0, r = 2e9 + 10;
        while(l < r)
        {
            long long mid = l + r + 1 >> 1;
            long long ans = 0;
            bool goal = true;
            for(int i = 0; i < n; i++)
            {
                if(a[i] < mid) ans += mid - a[i];
                if(x < ans)
                {
                    r = mid - 1, goal = false;    //若不满足条件,则说明h过高,要降低h;所以要在左边寻找,当前的mid不满足条件
                    break;
                }
            }
            if(goal) l = mid;
        }
        cout << l << endl;
    }
}
posted @ 2024-11-12 12:37  PeachyGalaxy  阅读(31)  评论(0编辑  收藏  举报