建造水族馆
每次测试时限: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;
}
标签:二分,int,建造,mid,long,水箱,测试用例,整数,水族馆
From: https://www.cnblogs.com/Xuxuan18/p/18542831