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;
}

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

时间: 2024-08-30 05:04:40

OCAC暑期比赛第三场 G题 汉堡汪 题解的相关文章

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

01字符串原题链接:http://codeforces.com/problemset/problem/165/C[题目描述]一个字符串被称为“01字符串”当且仅当它只包含字符“0”和“1”.我们从字符串 s 中取出连续的一段组成的非空字符串就是 s 的子串.比如,"010" 有6个子串:"0", "1", "0", "01", "10", "010".一个字符串的两个

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

魔法力量原题链接:http://codeforces.com/problemset/problem/670/D1[题目描述]从床上起来之后,爱丽丝决定做饼干.要完成一块饼干的制作,爱丽丝需要 n 种不同的材料.对于第 i 个材料,他需要的数量为 ai .目前爱丽丝有 n 种不同的材料.对于第 i 个材料,爱丽丝拥有的数量为 bi .爱丽丝初始有 k 点魔法值,每次她可以选择消耗一点魔法值,同时生成 n 种材料中的任意一个材料.你的任务是求出爱丽丝最多能够制作多少块饼干.[输入格式]输入的第一行包

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

线上的点原题链接:http://codeforces.com/problemset/problem/251/A[题目描述]一条直线上有 n 个点,他们的坐标分别是 x1,x2,……,xn.没有两个点的坐标相同.你可以从这些点中挑选出三个点,使得三个点的最大距离不超过 d .请求出满足条件的三个点的方案数.[输入格式]输入的第一行包含两个整数 n 和 d (1<=n<=10^5; 1<=d<=10^9).接下来的一行包含 n 个整数 x1,x2,……,xn,分别表示 n 个点的坐标,

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

袋鼠认妈妈原题链接:http://codeforces.com/problemset/problem/372/A[题目描述]有 n 只袋鼠(题目假设他们都是母的),你需要给他们组建成家庭.对于第 i 只袋鼠来说,它的大小用一个数字 Si 来表示.如果第 i 只袋鼠的大小 Si 达到了第 j 只袋鼠的大小 Sj 的两倍(即满足Si>=2*Sj),那么第 i 只袋鼠可以做第 j 只袋鼠的妈妈.并且如果第 i 只袋鼠已经做了另一只袋鼠的妈妈的话,那么她就不能再认妈妈了.一对母女袋鼠 或者 单独的一只袋

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

袋鼠认妈妈(加强版)原题链接:http://codeforces.com/problemset/problem/372/A不过这道题目是一道变形题,在原题的基础上面做了修改,所以这里的标程不能过CF原题.[题目描述]有 n 只袋鼠(题目假设他们都是母的),你需要给他们组建成家庭.对于第 i 只袋鼠来说,它的大小用一个数字 Si 来表示.如果第 i 只袋鼠的大小 Si 达到了第 j 只袋鼠的大小 Sj 的两倍(即满足Si>=2*Sj),那么第 i 只袋鼠可以做第 j 只袋鼠的妈妈.注意这道题目(加

题解报告(CDUT暑期集训——第三场)

题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口算法 按着题解的从后往前做(ps:菜是原罪 AC代码 #include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> #incl

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

男孩或者女孩原题链接:http://codeforces.com/problemset/problem/236/A[题目描述]现如今,很多男孩在论坛中使用漂亮女孩的照片作为头像.所以确定一个用户的性别就变成了一个困难的事情.去年,我们的聪聪进入了一个论坛,并且和一个(他认为是)女生相谈甚欢.他们聊得非常投机,满满地,他们开始了网恋.但是,就在昨天,聪聪和她的“女朋友”在现实世界中碰了面,并且发现这个“她”其实是一个非常强壮的男人!我们的聪聪倍感心伤,感觉不会再爱了.于是我们的聪聪提出了一套根据用

OCAC暑期比赛第一场 D题 足球比赛中的危险状态 题解

足球比赛中的危险状态原题链接:http://codeforces.com/problemset/problem/96/A[题目描述]灵灵非常喜欢足球.有一天,灵灵正在看一场足球比赛,在看比赛的同时灵灵在纸上写下了每一位运动员当前的位置.为了简化所有运动员的位置的描述,灵灵将其简化成了仅由字符 "0" 和 "1" 描述的一个字符串.每一个 "0" 表示主队的一个运动员,每一个 "1" 表示客队的一个运动员.如果当前的位置中存在连

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

有用的数学原题链接:http://codeforces.com/problemset/problem/339/A不过在原题基础上做了一些强化,以巩固学生对输入的处理能力.[题目描述]聪聪是爱丽丝魔法学院的三年级学生.他现在正在学习加法运算.老师写下了一组加法运算.聪聪需要计算这组运算的结果.老师给的问题是包含多个整数的加法(这些整数的数据范围在 1 到 1000 之间),并且两个正数之间有一个字符 "+" .但是如果公式中存在前一个元素比后一个元素大的情况,聪聪就不会算了.聪聪能够解决