上次你帮小明解决了小红出的题目,但是小明并没有按照约定分你一半KFC,你感到非常生气,于是私下里找到小红说出了真相,小红发现被骗后也很生气,于是下决心要和小明绝交。
这下轮到小明慌啦,因为他还指望以后能抄小红的数学作业呢(真屑),于是决定请小红吃KFC来挽回友情,可是今天并不是疯狂星期四,小明想要省钱但必须要尽快和小红道歉,不然真就无法挽回啦。这时他想到了家里好像有个食谱能教你做汉堡,于是小明把小红和你请到家里,打算自己做汉堡来请你们吃。
这个奇怪的食谱只教你怎么做汉堡,而且每种汉堡所要的食材都只有固定的三种:B(代表面包),S(代表香肠),C(代表奶酪)。食谱中的成分从下往上排列,例如,食谱 "BSCBS "代表汉堡包,其中成分从下往上排列为面包、香肠、奶酪、面包和香肠。只有严格用以上数量的食材才能做出汉堡,少一个都不行。
小明的厨房里有b块面包,s个香肠和c个奶酪,最近的超市也有卖这三种东西,面包的单价为B元,香肠的单价为S元,奶酪的单价为C元。小明的零花钱还剩money元,小明想知道用完这些零花钱和厨房的食材最多能做多少个汉堡?小明忙着做汉堡没功夫算这个了,于是他又双叒来找你了,想让你帮他算出他最多能做出汉堡的数量。
输入格式
第一行一个字符串s,代表食谱;第二行三个整数b、s、c,代表厨房的食材数量;第三行三个三个数B、S、C,代表超市的价格;第四行一个整数,代表小明的零花钱money。
输出格式
一个整数,代表最多能做的汉堡数。
样例输入
BBBSSC
6 4 1
1 2 3
4
样例输出
2
数据范围
∣ s ∣ ≤ ∣ 100 ∣ |s|≤|100| ∣s∣≤∣100∣
0 ≤ a , b , c ≤ 100 0≤a,b,c≤100 0≤a,b,c≤100
0 ≤ A , B , C ≤ 100 0≤A,B,C≤100 0≤A,B,C≤100
0 ≤ m o n e y ≤ 1 e 12 0≤money≤1e12 0≤money≤1e12
解题思路
二分答案:
制作的汉堡越多,需要的money
越多;制作的汉堡越少,需要的money
越少。
long long bin_search() {
long long l = 0, r = max_money, m;
while (l + 1 != r) {
m = l + r >> 1;
if (judge(m)) l = m;
else r = m;
}
return l;
}
根据要求制作的汉堡数统计需要的食材数,然后计算出需要的cost
,判断能否支付。
bool judge(long long x) {
long long cost = 0;
cost += (need_b * x - b) > 0 ? (need_b * x - b) * B : 0;
cost += (need_c * x - c) > 0 ? (need_c * x - c) * C : 0;
cost += (need_s * x - s) > 0 ? (need_s * x - s) * S : 0;
return cost <= money;
}
最后,AC代码如下:
#include <iostream>
using namespace std;
const int max_len = 100;
const long long max_money = (long long)(1e6) * (long long)(1e6);
string str;
long long b, s, c, B, S, C, money;
long long need_b, need_s, need_c;
bool judge(long long x) {
long long cost = 0;
cost += (need_b * x - b) > 0 ? (need_b * x - b) * B : 0;
cost += (need_c * x - c) > 0 ? (need_c * x - c) * C : 0;
cost += (need_s * x - s) > 0 ? (need_s * x - s) * S : 0;
return cost <= money;
}
long long bin_search() {
long long l = 0, r = max_money, m;
while (l + 1 != r) {
m = l + r >> 1;
if (judge(m)) l = m;
else r = m;
}
return l;
}
int main() {
cin >> str;
for (int i = 0; i < str.size(); i++) {
if (str[i] == 'B') need_b++;
else if (str[i] == 'S') need_s++;
else need_c++;
}
cin >> b >> s >> c >> B >> S >> C;
cin >> money;
cout << bin_search() << endl;
return 0;
}