假设可以组成10套牌,然后根据我们手里的牌开始组合,如果我们手里有1 2 3 joker这四种牌,要组成十套牌的话,我们用10减去1的数量,如果>0,则需要joker去补,同样,2,3也是这样。我们算一下joker需要补多少张,如果大于我们手里的joker
数量则组不成10套牌,如果>10就说明了至少有一组牌存在两张joker也不符合。组不成10套牌就寻找10以下的套牌数量,能组成的话就寻找10以上的(包括10)
#include <iostream> using namespace std; int n; long long m; const int maxn = 54; long long arr[maxn]; bool judge(long long num) { long long ans=0; for (int i = 1; i <= n; i++) { if (arr[i] < num) { ans += (num - arr[i]); } if (ans>num||ans>m)return false; } return true; } long long find(long long l, long long r) { while (l < r) { long long mid = l+(r-l+1)/2; if (judge(mid))l = mid; else r = mid - 1; } return l; } int main() { scanf("%d%lld",&n,&m); for (int i = 1; i <= n; i++) { cin >> arr[i]; } cout<< find(1, 0x3f3f3f3f); }