代码源:962、小明秘制小汉堡!

173 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情 logo.png

题目描述

这是代码源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;
}