#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int a[N];
int n,m,ans=0;
bool check(int mid)//mid取的是输出的结果
{
if(mid<=ans+m) return true;//m已经减去给最大值分配的分数,所以直接就可以进行比较了
else return false;
}
signed main()
{
cin>>n>>m;
int minnum=1e9,maxnum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]<minnum) minnum=a[i];
if(a[i]>maxnum) maxnum=a[i];
ans += a[i];
}
ans -= (minnum+maxnum);//将最大值与最小值从和中减去
int vis=ans+m-maxnum*(n-2);//这里m次操作,可以看成是加m分,将m加到和里去(目的是为了下一步
//判断最后中间数的值是否超出最大值)
if(vis>0) m = m - ceil((double)vis/(n-1));//如果超出了就将m的值减去分配给最大值的分数
//向上取整是只要有一个之超出了最大值,就要给最
//大值分配一个,除以(n-1),是看剩余的分数可以
//为最大值增加多少分
int l=0,r=1e14;//二分
while(l<r)
{
int mid=(l+r+1)/2;
if(check(mid)) l=mid;
else r=mid-1;
}
cout<<l;
}
洛谷 P7713 「EZEC-10」打分
最新推荐文章于 2024-07-02 17:54:46 发布