https://ac.nowcoder.com/acm/problem/19916

题意:
给n种牌,每种牌有a[i]张,m张万能牌,问能组成多少套牌。(每套牌只能使用一次万能牌)

分析:
可以考虑二分答案,贪心进行判断。
二分思路:假设答案为x,即最多能够构成x套牌,那么每种牌至少x张,所以但c[i]<x时要用万能牌进行补充,如果c[i]<x,统计万能牌使用数量,即sum+=(x-c[i])。最后判断一下万能牌使用数量是否小于m且每套牌是否只用一次万能牌,即sum<=min(m,x)。
记得开longlong!

代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<vector>
using namespace std;
typedef long long ll;
ll i,j,n,k,m,t,s,y;
ll ans;
ll a[55],f[55];
bool check(ll x){
    ll sum=0;
    for(int i=0;i<n;i++){
        if(a[i]<x){
            sum+=(x-a[i]);
        }else{
            break;
        }
    }
    return sum<=min(m,x);
}
int main()
{
    scanf("%lld%lld",&n,&m);
    for(i=0;i<n;i++){
        scanf("%lld",&a[i]);
    }
    sort(a,a+n);
    ll l=0,r=1e9;
    while(r>=l){
        ll mid=(l+r)>>1;
        if(check(mid)){//mid满足
            l=mid+1;
            ans=mid;
        }else{
            r=mid-1;
        }
    }
    printf("%lld",ans);
}