分析题干,又是在不确定中确定答案,所以又是二分查找+检验 这里涉及的一细节就是check函数用来检验当前的套数是否合理,所以需要满足2个条件
- 第一个就是使用到的joker牌不能超过m,
- 其次就是使用的joker牌在每套中不能出现两次,根据鸽巢原理(假设有10个鸽笼,飞来11只鸽子,那么一定至少有一个笼子里至少有两只鸽子),也就是最终的使用joker数不能超过检验的套数x
接着就是左右边界的判断
- l从0开始,因为可能一套也配不上
- 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;
}