想了好久觉得这就应该是个贪心题,没曾想到看到题解竟然是个二分。。。
题解:正解是个二分,那么如何证明他具有单调性呢,如果他能组成x套牌,那么他一定可以组成x-1套牌,所以可以用二分来解这道题目。
如何check mid是取大了还是取小了呢,假设当前组成mid件,如果a[i]<mid,那么mid-a[i]部分就需要用joker来填充了,所以当设ans是缺少的牌数的总量,所以要保证joker的数量大于ans,那么一个限制条件就是return ans<=k。
想一下还有没有另外一个限制条件呢?当然,题目还要求了 一套牌里面最多使用一个joker,所以我们的ans也要小于mid。
综上所述 return ans<=min(k,mid);(能组成正好mid件或者能做成大于midjia)
/*Keep on going Never give up*/ #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> const int maxn = 60; const int MaxN = 0x3f3f3f3f; const int MinN = 0xc0c0c00c; typedef long long ll; const int mod = 100000000; using namespace std; ll a[maxn]; ll n,k; bool check(ll x){ ll ans=0; for(int i=0;i<n;i++) if(a[i]<x) ans+=x-a[i]; return ans<=min(k,x); } int main() { cin>>n>>k; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); ll l=0,r=1e9; ll mid,ans=0; while(l<=r){ mid=(l+r)/2; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } cout<<ans<<endl; return 0; }