Lisa
有非常显然的一点是这个题可以二分
也可以不。
我们可以首先用普通牌凑出尽可能多的幅,然后对于缺的情况缺一张用joker添就行了,缺两张或更多就用joker去完整的一副里换出所需要的东西
二分的话思想也差不多
二分了mid的时候,最多可以用mid张joker,
然后结合上面的思想,缺了的用joker来搞
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<stack> #include<map> #define int long long using namespace std; int n,m; int x; int a[60]; bool check(int x){ int res=0; int mm=min(x,m); for(int i=1;i<=n;++i){ res+=(x>a[i]?x-a[i]:0); } return res<=mm; } signed main(){ scanf("%lld%lld",&n,&m); int cnt=0; for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); } int l=1,r=750000000; int ans; while(l<=r){ int mid=(l+r)>>1; if(check(mid)){ l=mid+1; ans=mid; }else{ r=mid-1; } } cout<<ans; return 0; }