Hamburgers(二分+贪心)(又名: 比奇堡的汉堡节)

题目连接: 比奇堡的汉堡节

题目:

比奇堡一年一度的汉堡节到了,身为比奇堡皇家指定汉堡王牌店铺”蟹堡王”的独一无二(emm,好像只有一个=.=)的厨师海绵宝宝超超超超…级开心,因为做汉堡是他最喜欢做的事(第二喜欢抓海母.),如果可以,海绵宝宝想做1万亿个汉堡给大家分享,但是抠门的蟹老板只为他提供一定的食材和一定的money供他买食材做汉堡,海绵宝宝很无奈(>.<), 只能妥协。
抠门的蟹老板只提供了三种食材’B’(bread),’S’(sausage),’C’(cheese)也限制海绵宝宝只能买这三种食材,海绵宝宝OZR蟹老板也无动于衷,还好!有”蟹黄堡”秘方!但海绵宝宝是专一的,只做一种汉堡,如果一种汉堡做法是”BSCBS ”,说明汉堡从下到上由是bread,sausage,cheese,bread,sausage组成的,也就是说做一个汉堡需要2个B,2个S,1个C。
当然,海绵宝宝想充分利用money去买那三种食材(只要钱够,多少数量都可以),使得他能做最多的汉堡。

Input
多组输入。
第一行输入是汉堡的种类
第二行包含3个数字,分别是nb,ns,nc(1<=nb,ns,nc <=100)------分别是B,S,C的数量
第三行包含3个数字,分别是Pb,Ps,Pc(1<=Pb,Ps,Pc<=100)-------分别是B,S,C的单位价格
第四行包含1个数字,r(1<=r<=1e12)--------表示蟹老板给海绵宝宝的钱

Output
海绵宝宝想做最多数量的”蟹黄堡”,需要请你帮忙,你觉得在充分利用给定食材和钱的前提下,海绵宝宝最多可以做几个”蟹黄堡”,请输出。
注意数据范围哦。

Examples
Input
BBBSSC
6 4 1
1 2 3
4
Output
2
Input
BBC
1 10 1
1 10 1
21
Output
7
Input
BSC
1 1 1
1 1 3
1000000000000
Output
200000000001

解题思路:

本题由于r给的数据最大值为1e12, 单独的线性暴力一定会被T, 所以采用二分的思想进行时间复杂度优化.
再运用贪心的思维, 把每次符合要求的局部最优解都进行记录, 最终可以得到答案

AC代码:

#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#define ll long long
using namespace std;
int main(void)
{
	string a; cin >> a;
	ll nb = 0, ns = 0, nc = 0;//汉堡需要的BSC
	for (int i = 0; i < a.length(); i++) {
		if (a[i] == 'B') nb++;
		else if (a[i] == 'S') ns++;
		else nc++;
	}
	ll b, s, c; cin >> b >> s >> c;//拥有的bsc
	ll pb, ps, pc; cin >> pb >> ps >> pc;//bsc的价格
	ll money; cin >> money;
	ll left = 0, right = (ll)1E14;//上限可以假设任意大于1E12的数据
	ll ans = 0;
	/* 开始二分 */
	while (left <= right) {
		ll mid = (left + right) / 2;//假设做mid个汉堡为所求
		ll cb = mid * nb - b, cs = mid * ns - s, cc = mid * nc - c;//分别算出差的BSC
		//如果差的有小于0的, 表示当前项是足够的, 应记为0 (非常重要!!!)
		if (cb < 0) cb = 0;if (cs < 0) cs = 0;if (cc < 0) cc = 0;
		
		ll nm = cb * pb + cs * ps + cc * pc;//计算出需要的钱
		if (nm <= money) ans = mid;//记录局部最优解
		if (nm > money) right = mid - 1;
		else left = mid + 1;
	}
	cout << ans << endl;
	return 0;
}

这个题特别注意的应该也就是差的BSC小于0的情况了. 如果小于0了 你不把他归为0, 则会导致钱更多了, 从而导致答案错误, 当时在这里WA了很久.

END

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
被随机mask处理的文本是指将文本中的某些单词随机替换为 [MASK] 标记,以便训练Bert模型。以下是将文本处理为被随机mask处理成Bert的tokeinzer所需要的步骤: 1. 安装Bert的tokeinzer库 首先需要安装Bert的tokeinzer库,可以使用以下命令进行安装: ``` pip install transformers ``` 2. 加载Bert的tokeinzer 接下来需要加载Bert的tokeinzer,可以使用以下代码: ```python from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') ``` 其中,'bert-base-uncased'是Bert模型的预训练模型名称,也可以根据需要选择其他预训练模型。 3. 处理文本并随机mask 现在可以使用Bert的tokeinzer对文本进行处理,并将其中的某些单词随机替换为 [MASK] 标记。以下是一个示例: ```python text = "I love pizza and hamburgers" tokens = tokenizer.tokenize(text) masked_tokens = [] for i, token in enumerate(tokens): if i == 0 or i == len(tokens) - 1: masked_tokens.append(token) else: if random.random() < 0.15: masked_tokens.append('[MASK]') else: masked_tokens.append(token) masked_text = ' '.join(masked_tokens) ``` 在上述代码中,使用Bert的tokeinzer将文本分解为单词,并将其中的第一个单词和最后一个单词保留。对于其余的单词,使用随机函数将其替换为 [MASK] 标记。最后,将处理后的单词列表重新组合成文本。 这样处理后的文本就可以用于训练Bert模型了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逍遥Fau

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

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

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

打赏作者

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

抵扣说明:

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

余额充值