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

OCAC暑期比赛第三场 G题 汉堡汪 题解

时间:2019-07-09 13:48:23      阅读:92      评论:0      收藏:0      [点我收藏+]

标签:namespace   人民币   char   ring   space   制作   ++   bre   har   

汉堡汪
原题链接:http://codeforces.com/problemset/problem/371/C
【题目描述】
汪老师准备做汉堡给你吃。
但是汪老师只会做一种类型的汉堡,汪老师把他叫做一码汉堡。
一码汉堡的组成很简单,它只由面包片(用‘B‘表示)、香肠(用‘S‘表示)、起司(用‘C‘表示)组成。
汪老师有一张食谱,是一个字符串,里面标记了一码汉堡的组成。
比如,如果食谱是“BBBSSC”的话,那就是说,这个汉堡是:
先叠三块面包片,然后再叠两根香肠,最后再叠一片起司。
这样这个汉堡就制作完成了。
汪老师现在有 nb 片面包片,ns 根香肠, nc 片起司,以及 r 元人民币。
汪老师可以用这 r 元人民币去旁边的便利店买材料,
已知一片面包片的价格是 pb 元,一根香肠的价格是 ps 元,一片起司的价格是 pc 元。
请问汪老师最多能够做多少个一码汉堡。
【输入格式】
输入个第一行包含一个字符串用于表示一码汉堡的食谱,字符串的长度不超过100,
并且该字符串只包含字符 ‘B‘ (表示面包片)、‘S‘(表示香肠)和‘C‘(表示起司)。
输入的第二行包含三个数字 nb 、 ns 、 nc ,分别表示汪老师拥有的面包片、香肠、起司的数量。(1<=nb,ns,nc<=100)
输入的第三行包含三个数字 pb 、 ps 、 pc ,分别表示面包片、香肠、起司的单价。(1<=pb,ps,pc<=100)
输入的第四行包含一个整数 r ,用于表示汪老师拥有的人民币。(1<=r<=10^12)。
【输出格式】
输出汪老师最多能制作的汉堡的数量。如果汪老师连一个汉堡都做不出来,输出 0 。
【样例输入1】
BBBSSC
6 4 1
1 2 3
4
【样例输出1】
2
【样例输入2】
BBC
1 10 1
1 10 1
21
【样例输出2】
7
【样例输入3】
BSC
1 1 1
1 1 3
1000000000000
【样例输出3】
200000000001
【题目分析】
注:这道题目存在线性解法,但是这里为了讲解二分还是用二分的解法来解。
我们可以用二分来解决这道问题。
首先对于输入的字符串,我们要从字符串中解析出制作一个汉堡需要的面包片数量 sb、香肠数量 ss 和起司数量 sc。
然后我们写一个 bool check(long long k) 函数,该函数返回汪老师利用现有的材料和金钱能否制作出 k 个汉堡。
然后我们二分找到最大的那个满足 check(k) 条件的 k 。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;

string t;
long long s[3], n[3], p[3], r;

bool check(long long k) {
    long long cnt = 0LL;
    for (int i = 0; i < 3; i ++) {
        cnt += max(k * s[i] - n[i], 0LL) * p[i];
    }
    if (cnt > r) return false;
    return true;
}

void solve() {
    long long L = 0LL, R = 2000000000200LL, res;
    while (L <= R) {
        long long mid = (L + R) / 2LL;
        if (check(mid)) {
            res = mid;
            L = mid + 1LL;
        } else {
            R = mid - 1LL;
        }
    }
    cout << res << endl;
}

int main() {
    cin >> t;
    int len = t.length();
    for (int i = 0; i < len; i ++) {
        char c = t[i];
        switch (c) {
        case ‘B‘:
            s[0] ++;
            break;
        case ‘S‘:
            s[1] ++;
            break;
        case ‘C‘:
            s[2] ++;
            break;
        default:
            break;
        }
    }
    for (int i = 0; i < 3; i ++) cin >> n[i];
    for (int i = 0; i < 3; i ++) cin >> p[i];
    cin >> r;
    solve();
    return 0;
}

 

OCAC暑期比赛第三场 G题 汉堡汪 题解

标签:namespace   人民币   char   ring   space   制作   ++   bre   har   

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

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