OCAC暑期比赛第三场 F题 魔法力量 题解

Posted ocac

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OCAC暑期比赛第三场 F题 魔法力量 题解相关的知识,希望对你有一定的参考价值。

魔法力量
原题链接: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;

 

以上是关于OCAC暑期比赛第三场 F题 魔法力量 题解的主要内容,如果未能解决你的问题,请参考以下文章

OCAC暑期比赛第三场 H题 01字符串 题解

OCAC暑期比赛第三场 E题 线上的点 题解

OCAC暑期比赛第三场 I题 袋鼠认妈妈 题解

OCAC暑期比赛第三场 J题 袋鼠认妈妈(加强版) 题解

OCAC暑期比赛第一场 E题 有用的数学 题解

OCAC暑期比赛第一场 F题 字符串加密 题解