【二分最大答案】 无敌浩克
题意
\(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;
}

浙公网安备 33010602011771号