测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A21371. 制作蛋糕(cake.cpp)

填空题 中等

题目描述

制作蛋糕(cake.cpp)

题目描述

圣诞节联欢活动有制作蛋糕环节。每个同学获得 n 种食材(编号 1~n),第 i 种食材的量为 bᵢ克,另有 k 克万能粉(1 克万能粉可代替 1 克任意食材)。制作一个蛋糕需要第 i 种食材 aᵢ克(必须使用所有食材),求最多能制作的蛋糕个数。

输入描述

第一行包含两个正整数 n 和 k(1≤n≤1e5,1≤k≤1e3);第二行包含 n 个整数 a₁、a₂、…、aₙ(1≤aᵢ≤1e3),表示每个蛋糕所需第 i 种食材的量;第三行包含 n 个整数 b₁、b₂、…、bₙ(1≤bᵢ≤1e3),表示每个同学获得第 i 种食材的量。

输出描述

输出最多能制作的蛋糕个数。

样例输入1

1 1000000000 
1 
1000000000

样例输出1

2000000000

样例输入2

10 1 
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 
1000000000 1000000000 1000000000 1000000000 
1 1 1 1 1 1 1 1 1 1

样例输出2

0

样例输入3

3 1 
2 1 4 
11 3 16

样例输出3

4

样例输入4

4 3 
4 3 5 6
 11 12 14 20

样例输出4

3

参考答案

include <bits/stdc++.h> usingnamespacestd; constint MAXN = 100001;  // 适配n≤1e5的范围 longlong a[MAXN], b[MAXN];  // 用long long避免溢出 longlong n, k; // 检查制作x个蛋糕是否可行 bool check(long long x) {     longlong need = 0;  // 总缺口     for (int i = 1; i <= n; ++i) {         // 计算第i种食材的缺口:需求(x*a[i]) - 已有(b[i]),缺口不能为负         longlong gap = max(0LL, x * a[i] - b[i]);         need += gap;         // 提前剪枝:总缺口超过k则直接返回不可行         if (need > k) {             returnfalse;         }     }     return need <= k; } int main() {     cin >> n >> k;     for (int i = 1; i <= n; ++i) {         cin >> a[i];  // 每个蛋糕需要的第i种食材量     }     for (int i = 1; i <= n; ++i) {         cin >> b[i];  // 初始拥有的第i种食材量     }     // 二分查找的边界:左边界0,右边界取足够大的值(比如1e14)     longlong l = 0, r = 2e14;     longlong ans = 0;     while (l <= r) {         longlong mid = (l + r) / 2;         if (check(mid)) {             // mid可行,尝试更大的数             ans = mid;             l = mid + 1;         } else {             // mid不可行,尝试更小的数             r = mid - 1;         }     }     cout << ans << endl;     return0; }
上一题 下一题