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);
}
京公网安备 11010502036488号