分析题干,又是在不确定中确定答案,所以又是二分查找+检验 这里涉及的一细节就是check函数用来检验当前的套数是否合理,所以需要满足2个条件

  1. 第一个就是使用到的joker牌不能超过m,
  2. 其次就是使用的joker牌在每套中不能出现两次,根据鸽巢原理(假设有10个鸽笼,飞来11只鸽子,那么一定至少有一个笼子里至少有两只鸽子),也就是最终的使用joker数不能超过检验的套数x

接着就是左右边界的判断

  1. l从0开始,因为可能一套也配不上
  2. r就最坏的打算,每张牌自成一套就是把牌数加起来
#include<iostream>
using namespace std;
typedef long long LL;
const int N=60;
int n,m,a[N];
int check(LL x)
{
	LL sum=0;
    for(int i=1;i<=n;i++)
    {
    	if(a[i]<x)
        sum+=x-a[i];
    }
    return sum<=x&&sum<=m;
}
int main()
{
	cin>>n>>m;
    LL l=0,r=0;
    for(int i=1;i<=n;i++)cin>>a[i],r+=a[i];
    while(l<=r)
    {
    	LL mid=l+r>>1;
        if(check(mid))l=mid+1;
        else r=mid-1;
    }
    cout<<l-1;
    return 0;
}