魔法力量
原题链接:http://codeforces.com/problemset/problem/670/D1
【题目描述】
从床上起来之后,爱丽丝决定做饼干。
要完成一块饼干的制作,爱丽丝需要 n 种不同的材料。对于第 i 个材料,他需要的数量为 ai 。
目前爱丽丝有 n 种不同的材料。对于第 i 个材料,爱丽丝拥有的数量为 bi 。
爱丽丝初始有 k 点魔法值,每次她可以选择消耗一点魔法值,同时生成 n 种材料中的任意一个材料。
你的任务是求出爱丽丝最多能够制作多少块饼干。
【输入格式】
输入的第一行包含两个整数 n 和 k (1<=n,k<=1000),以一个空格分隔,分别表示材料的种类数和爱丽丝具有的魔法值的点数。
第二行包含一个整数序列 a1,a2,……,an(1<=ai<=1000),其中 ai 表示制作一块饼干需要消耗的第 i 种材料的数量。
第三行包含一个整数序列 b1,b2,……,bn(1<=bi<=1000),其中 bi 表示爱丽丝拥有的第 i 种材料的数量。
【输出格式】
输出爱丽丝能够制作的饼干地最高的数量。
【样例输入1】
3 1
2 1 4
11 3 16
【样例输出1】
4
【样例输入2】
4 3
4 3 5 6
11 12 14 20
【样例输出2】
3
【题目分析】
这道题目涉及的算法:二分。
二分的自变量是饼干的个数num,应变量是爱丽丝利用当前的材料和魔法值能否制作出num块饼干。
实现代码如下:
#include <bits/stdc++.h> using namespace std; const int maxn = 1010; int n, k, a[maxn], b[maxn]; bool check(int num) { int cnt = 0; for (int i = 0; i < n; i ++) { cnt += max(num * a[i] - b[i], 0); if (cnt > k) return false; } return true; } int main() { cin >> n >> k; for (int i = 0; i < n; i ++) cin >> a[i]; for (int i = 0; i < n; i ++) cin >> b[i]; int L = 0, R = 2000, res; while (L <= R) { int mid = (L + R) / 2; if (check(mid)) { res = mid; L = mid + 1; } else R = mid - 1; } cout << res << endl; return 0; }
原文地址:https://www.cnblogs.com/ocac/p/11156513.html
时间: 2024-10-02 02:53:29