题意:
有n种牌,第i种牌有ai 张,一套牌为n张牌每种各一张,为凑出更多的牌,用m张空白牌写上种类,每种最多写bi张,求最多能凑几幅牌。
思考:
已知ai、bi,不考虑有多少张空白牌,最多能凑minn=min(ai+bi) (1<=i<=n)套牌,vi=minn-ai为还未凑齐的牌,每次v计算最大值的数量max,max为某套牌还差多少张,如果max<=m表明还能凑成一套,则每个最大值减1,m减max,反之不能;当vi(1<=i<=n)=0时表示第i种牌用完,结束。
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 200010;
int main() {
int n, a[N], b[N], minn = 0x3f3f3f3f;
long long m;
scanf("%d%d",&n, &m);
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
for(int i=0; i<n; i++) {
scanf("%d", &b[i]);
minn = min(minn, a[i] + b[i]);
}
int v[N];
for(int i=0; i<n; i++)
v[i] = minn - a[i];
sort(v, v+n);
while(m > 0) {
int i = lower_bound(v, v+n, v[n-1]) - v;
if(m >= n - i) {
for(int j=i; j<n; j++)
v[j]--;
}
if(!v[n-1])
break;
m = m - n + i;
}
printf("%d\n", minn - v[n-1]);
return 0;
}