持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
题目描述
这是代码源5月30日的div2每日一题
小明秘制小汉堡! - 题目 - Daimayuan Online Judge
上次你帮小明解决了小红出的题目,但是小明并没有按照约定分你一半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
- 0≤a,b,c≤100
- 0≤A,B,C≤100
- 0≤money≤1e12
问题解析
二分答案,枚举可能的汉堡数,然后看是否能做出这么多汉堡,如果可以我们去左边界接着找,如果不行我们就去右边界找。
判断能不能做出这么多汉堡:我们先遍历食谱,把三个材料所需要的数量记录下来。然后再计算做出这么多汉堡需要的数量,看我们当前的材料+钱买的材料够不够,如果买完材料后我们的钱变成负的了,那就说明做不了这么多汉堡。反之可以。
AC代码
#include<iostream>
using namespace std;
#include<vector>
#include<algorithm>
#include<math.h>
#include<set>
#include<numeric>
#include<string>
#include<string.h>
#include<iterator>
#include<map>
#include<unordered_map>
#include<stack>
#include<list>
#include<queue>
#include<iomanip>
#define endl '\n'
#define int ll
typedef long long ll;
typedef pair<ll, ll>PII;
const int N = 1e5 + 50;
bool check(int nums,int a,int b,int c,int x,int y,int z,int B,int S,int C,int money)
{
ll res = money;
ll B1 = B * nums, S1 = S * nums, C1 = C * nums;
if (B1 > a)res -= (B1 - a) * x;
if (S1 > b)res -= (S1 - b) * y;
if (C1 > c)res -= (C1 - c) * z;
return res >= 0;
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
string s;
int a, b, c, x, y, z, B = 0, S = 0, C = 0, money;
cin >> s >> a >> b >> c >> x >> y >> z >> money;
for (auto i : s)
{
if (i == 'B')B++;
else if (i == 'S')S++;
else C++;
}
int l = 0, r = 1e12;
while (l < r)
{
int mid = (l + r + 1) / 2;
if (check(mid,a,b,c,x,y,z,B,S,C,money))l = mid;
else r = mid - 1;
}
cout << l;
return 0;
}