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

Posted ocac

tags:

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

汉堡汪
原题链接: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题 汉堡汪 题解的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

OCAC暑期比赛第一场 B题 字符串任务 题解

OCAC暑期比赛第一场 G题 男孩或者女孩 题解