蓝桥杯2022年第十三届决赛真题-卡牌 - C语言网 (dotcpp.com)
题目描述
这天,小明在整理他的卡牌。
他一共有 n 种卡牌,第 i 种卡牌上印有正整数数 i(i ∈ [1, n]),且第 i 种卡牌 现有 ai 张。
而如果有 n 张卡牌,其中每种卡牌各一张,那么这 n 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌,拿出了 m 张空白牌,他可以在上面写上数 i,将其当做第 i 种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 i 种牌最多手写 bi 张。
请问小明最多能凑出多少套牌?
分析
答案具有单调性!!!答案具有单调性!!!答案具有单调性!!!
二分二分二分!!!
注意long long
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e7 + 10;
ll n, m, a[N], b[N];
bool check(int mid)
{
ll cnt = 0;
for(int i = 1; i <= n ; i ++)
{
if(mid > a[i] + b[i])return false;
if(a[i] < mid)cnt += mid - a[i];
}
if(cnt > m)return false;
return true;
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i ++)
{
cin >> a[i];
}
for(int i = 1; i <= n; i ++)
{
cin >> b[i];
}
ll l = 0, r = 0x3f3f3f;
while(l + 1 != r)
{
int mid = (l + r) >> 1;
if(check(mid))l = mid;
else r = mid;
}
cout << l;
return 0;
}