[蓝桥杯 2022 国 B] 卡牌
题目描述
这天,小明在整理他的卡牌。
他一共有 n n n 种卡牌,第 i i i 种卡牌上印有正整数数 i ( i ∈ [ 1 , n ] ) i(i \in[1, n]) i(i∈[1,n]), 且第 i i i 种卡牌现有 a i a_{i} ai 张。
而如果有 n n n 张卡牌,其中每种卡牌各一张,那么这 n n n 张卡牌可以被称为一套牌。小明为了凑出尽可能多套牌,拿出了 m m m 张空白牌, 他可以在上面写上数 i i i,将其当做第 i i i 种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 i i i 种牌最多手写 b i b_{i} bi 张。
请问小明最多能凑出多少套牌?
输入格式
输入共 3 行,第一行为两个正整数 n n n, m m m 。
第二行为 n n n 个正整数 a 1 , a 2 , … , a n a_{1}, a_{2}, \ldots, a_{n} a1,a2,…,an 。
第三行为 n n n 个正整数 b 1 , b 2 , … , b n b_{1}, b_{2}, \ldots, b_{n} b1,b2,…,bn 。
输出格式
一行,一个整数表示答案。
样例 #1
样例输入 #1
4 5
1 2 3 4
5 5 5 5
样例输出 #1
3
提示
【样例说明】
这 5 5 5 张空白牌中,拿 2 2 2 张写 1 1 1,拿 1 1 1 张写 2 2 2,这样每种牌的牌数就变为了 3 , 3 , 3 , 4 3,3,3,4 3,3,3,4,可以凑出 3 3 3 套牌,剩下 2 2 2 张空白牌不能再帮助小明凑出一套。
【评测用例规模与约定】
对于 30 % 30 \% 30% 的数据,保证 n ≤ 2000 n \leq 2000 n≤2000;
对于 100 % 100 \% 100% 的数据,保证 n ≤ 2 × 1 0 5 ; a i , b i ≤ n ; m ≤ n 2 n \leq 2 \times 10^{5} ; a_{i}, b_{i} \leq n ; m \leq n^{2} n≤2×105;ai,bi≤n;m≤n2 。
蓝桥杯 2022 国赛 B 组 C 题。
思路
直接用二分答案的思路即可。
代码
//二分答案
//这道题有个关系就是牌的次数,牌的次数和坐标对应相等
#include<iostream>
#include<algorithm>
#define int long long
using namespace std;
const int N = 2e5+10;
int a[N];
int n,m;
int b[N];
bool check(int x){
int need=0;
for(int i=1;i<=n;i++){
if(x-a[i]<=b[i]){
need+=max(0ll,x-a[i]);
}else{
return false;
}
}
return need<=m;
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
int l=-1,r=2e18;
while(l+1!=r){
int mid=(l+r)>>1;
if(check(mid))l=mid;
else r=mid;
}
cout<<l;
return 0;
}