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); }