link:https://codeforces.com/problemset/problem/1873/E
* 首先,先設定最大上限 **max_limit** 為 $x+v[i],i=1\sim n$
* 接著,用二分搜在 **1~max_limit** 中搜尋高度,並找到不大於 $x$ 個剩餘空格的高度 $h$ (利用右側邊界的二分搜)
```C++=
#include <bits/stdc++.h>
using namespace std;
int t;
int n,x;
long long int count_blank(int inp, vector<int> &v){
long long int ans = 0;
for(int i=0;i<v.size();i++){
ans+=(inp-v[i])*(v[i]<=inp);
}
return ans;
}
long long int upper_bounds(long long int &max_limit, vector<int> &v){
long long int start = 1;
long long int ends = max_limit;
long long int count;
while(start <= ends){
long long int mid = start + (ends-start)/2;
count = count_blank(mid,v);
if (count>x) ends = mid-1;
else start = mid+1;
}
return ends;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin>>t;
while(t--){
cin>>n>>x;
vector<int> v(n);
long long int sum = 0;
for (int i=0;i<n;i++){
cin>>v[i];
sum+=v[i];
}
long long int max_limit = (sum+x)/n;
long long int ans= upper_bounds(max_limit, v);
cout<<ans<<"\n";
}
}
```