码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-07-09 13:41:21      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:turn   max   lse   clu   输入   决定   for   包含   不同   

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

标签:turn   max   lse   clu   输入   决定   for   包含   不同   

原文地址:https://www.cnblogs.com/ocac/p/11156513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!