汉堡汪
原题链接: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