描述
方馆长决定建造一个水族箱。他有一块珊瑚,由 n 根柱子组成,第 i 根柱子的高度为 ai。接着,你将按照以下方式围绕珊瑚建造一个水箱:
1、选择一个整数 h≥1 —— 水箱的高度。
2、在水箱的两侧建造高度为 h 的墙壁。
3、将水箱注满水,使得每根柱子的高度为 h,除非珊瑚的高度超过 h,这种情况下,该柱子不需要添加水。
image.png
例如,当 a=[3,1,2,4,6,2,5] 和高度为 h=4 时,最终需要使用
w=8 单位的水,如图所示。
方馆长最多可以使用 x 单位的水来填满水箱,但方馆长希望建造尽可能大的水箱。他可以选择的高度 h 的最大值是多少?
输入描述
第一行包含一个整数 t (1 ≤ t ≤ 10) —— 测试用例的数量。
每个测试用例的第一行包含两个正整数 n 和 x,(1 ≤ n ≤ 100000,1 ≤ x ≤ 1000000000)—— 珊瑚的柱子数量和你可以使用的最大水量。
每个测试用例的第二行包含 n 个空格分隔的整数 ai(1 ≤ ai ≤ 1000000000) —— 珊瑚柱子的高度。
输出描述
对于每个测试用例,输出一个正整数 h —— 水箱的最大高度
用例输入 1
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
用例输出 1
4
4
2
335
1000000001
#include <bits/stdc++.h>
using namespace std;
int t,n,x,a[100010];
long long check(int s){
long long res=0;
for(int i=1;i<=n;i++){
if(a[i]<s)res+=(s-a[i]);
}
return res;
}
int main(){
cin>>t;
while(t--){
cin>>n>>x;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
long long l=1,r=a[1]+x,ans=-1;
while(l<=r){
long long mid=(l+r)/2;
if(check(mid)<=x){
l=mid+1;
ans=mid;
}
else{
r=mid-1;
}
}
cout<<ans<<endl;
}
}
349

被折叠的 条评论
为什么被折叠?



