整数二分—建造水族馆

建造水族馆

每次测试时限:2 秒
每次测试的内存限制:256 兆字节
输入:标准输入
输出:标准输出

题目:

你喜欢养鱼,所以你决定建造一个水族馆。你有一块由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<=10^4) - 测试用例数。
每个测试用例的第一行包含两个正整数 n和x( 1<=n<=2*10^5 ; 1 <=x<=10^9 )--珊瑚的列数和最大水量。
每个测试用例的第二行包含n个空格分隔的整数 ai( 1<=ai<=10^9) 珊瑚的高度。
所有测试用例中n的总和不超过 2X10^5。

输出

对于每个测试用例,输出一个正整数 h(H>=1 ) - 水箱的最大高度,因此最多需要 x个单位的水才能装满水箱。
我们已经证明,在这些限制条件下,h这个值总是存在的。

注意

第一个测试案例如图所示。在 h=4 的情况下,我们需要8个单位的水,但如果 h 增加到 5,我们需要 13个单位的水,比 x=9多。因此h=4 是最佳方案。
在第二个测试案例中,我们可以选择 h=4,并在每列中添加 3个单位,总共使用 9个单位的水。可以证明这是最佳方案。
在第三个测试案例中,我们可以选择 h=2,并使用所有的水,因此这是最佳方案。

代码实现

using namespace std;
const int N = 2e5 + 10;
int t;
int n, x;
int a[N];
bool check(long long mid)
{
    long long ant = 0;
    for (int i = 1; i <= n; i++)
    {
        if (a[i] < mid)
            ant += mid - a[i];
        if (ant > x)
            return false;
    }
    return true;
}
void cheng()
    {
    cin >> n >> x;
    for (int i = 1; i <= n; i++)cin >> a[i];
    int l = 1, r = 2e9 + 10;
    while (l < r)
    {
        long long mid = r + l + 1;
        if (check(mid))l = mid;
        else r = mid - 1;
    }
    cout << l << "\n";
}
int main()
{
    while (t--)
        cheng();
    cin >> t;
    return 0;
}

posted @ 2024-11-12 23:04  洋洋萱  阅读(117)  评论(0)    收藏  举报