/*整体的思路是利用分治,如果组成X套牌可以,那么组成X - 1套牌也可以,那么就可以用二分查找法试探出使得组牌可以的最大套数值,现在最重要的就是实现一个check函数,检查配出x套牌可不可以
两个配牌方法实际可以看成是一种方法,即为要配一套牌必须要用到n种牌,但是缺了一种可以由joker牌来替代,不过不能存在需要同时抽两个或以上joker来配一套牌的状态,现在统计配x套牌需要多少张joker来补,一共需要max{0,x - c[i]}求和张joker来替补,记为S,则有S<=m,但是用什么条件来防止需要同时填补多张joker呢?只需保证S<=x即可,这个仔细思考可以得出S<=X &&S<= m时候即可满足能配x套牌
*/
#include <stdio.h>
#include <stdlib.h>
//实现判断能否组成x套牌的函数,这里考虑到s过大,应该用long long型数据
int check(long long *c, long long n, long long m, long long x){
long long s = 0;//s记录需要用来代替的joker数
for(long long i = 0; i < n; i ++){
long long tmp = x - c[i];
long long s_i = 0 > tmp ? 0 : tmp;
s += s_i;
}
if(s <= m && s <= x){
return 1;
}
else{
return 0;
}
}
int main() {
//读取数据
long long n, m;
scanf("%lld %lld\n", &n, &m);
long long *c = (long long *)malloc(sizeof(long long) * n);
if(c == NULL){
printf("Failed Malloc!\n");
return -1;
}
for(long long i = 0; i < n; i ++){
scanf("%lld", c + i);
}
//二分查找
long long l = 0;
//右端点h选一个绝对不会达到的大数,记住,一定要取得够大,覆盖的了边界条件
long long h = 9000000000000;
long long res = -1;
while(l <= h){
long long mid = l + (h - l) / 2;
if(check(c, n, m, mid)){
res = mid;
l = mid + 1;
}
else{
h = mid - 1;
}
}
printf("%lld\n",res);
free(c);
return 0;
}