[Daimayuan] 小明秘制小汉堡!(C++,二分)

上次你帮小明解决了小红出的题目,但是小明并没有按照约定分你一半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 0a,b,c100

0 ≤ A , B , C ≤ 100 0≤A,B,C≤100 0A,B,C100

0 ≤ m o n e y ≤ 1 e 12 0≤money≤1e12 0money1e12

解题思路

二分答案:

制作的汉堡越多,需要的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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WitheredSakura_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值