【二分最大答案】 无敌浩克

题意

\(n\)种牌,\(m\)张king ,每种牌有\(a[i]\) 张,每次可以并且只能使用1张\(king\)代替任意一种,并且每套牌中只能用一张\(king\),组成一套牌,问最多可以有套牌

题解

  • \(Check\) 如果某种牌的数量少于当前二分的值,需要用\(x - a[i]\)的king牌补充,才能组成牌

  • 如果king牌全部用光后,仍不够,说明当前二分的答案不可行

  • 因为一套牌中不能出现两张\(king\)牌,\(king\)牌必须跟非\(king\)牌组合,所以每一种牌都要减去其他种类的牌使用的\(king\)牌的数量,也就是当前枚举的种类不使用\(king\),其他使用\(king\)的情况,

  • 如果减后 \(< 0\)则说明了当前二分的答案不合法

Code

#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define Max 1e9
int a[55];
int king[55];
int n,m;
int b[55];
bool check(int x) 
{
    memset(king,0,sizeof king);
    int remain = m;
    memcpy(b, a, sizeof b);

    rep(i,1,n+1)// 得到当前牌数下所有种类需要使用的king的数量
    {
        if(x>b[i]) 
        {
            king[i] = x - b[i];
            remain -= king[i];
            if(remain<0) return false;
        }
    }

    rep(i,1,n+1)
    {
         rep(j,1,n+1)
         {
             if(i!=j) // 减去其他种类的牌使用的king
                 b[j] -= king[i];
             if(b[j]<0) return false;
         }
    }
    return true;
}
int main()
{
    cin>>n>>m;
    rep(i,1,n+1)
        cin >> a[i];
    int l = 1,r = Max;
    while(l < r)
    {
        int mid = (l+r+1)>>1;
        if(check(mid))
            l = mid;
        else r = mid-1;
    }
    cout<<l<<endl;
}

posted @ 2020-05-26 00:35  Hyx'  阅读(160)  评论(0)    收藏  举报