当前位置: 首页 > news >正文

【蓝桥杯集训·每日一题2025】 AcWing 4905. 面包店 python



AcWing 4905. 面包店

Week 4
3月14日

题目描述

贝茜开了一家面包店。

贝茜的面包店中只有一个烤箱,该烤箱制作一块饼干需要花费的时间为 t C t_C tC,制作一块松饼需要花费的时间为 t M t_M tM

烤箱每次只能制作一个糕点,也就是说制作 A A A 块饼干和 B B B 块松饼需要花费的时间为 A × t C + B × t M A \times t_C + B \times t_M A×tC+B×tM

N N N 个客人来光顾贝茜的生意,编号 1 ∼ N 1 \sim N 1N

客人是一个接着一个来的,并且第 i + 1 i+1 i+1 个客人一定会在第 i i i 个客人走后才会来。

i i i 个客人想要 a i a_i ai 块饼干和 b i b_i bi 块松饼。

为了保证售出糕点足够新鲜,贝茜一定会在客人下单后才开始现场制作其所需要的全部糕点。

每个客人的耐心都是有限的,对于第 i i i 个客人,如果贝茜制作其所需全部糕点花费的总时间超过 c i c_i ci,那么它就会生气离开。

贝茜不希望得罪任何客人,在第 1 1 1 个客人到来之前,它可以选择对它的烤箱进行升级。

烤箱每升一级,可以进行如下选择:要么使得生产一块饼干所需的时间减少 1 1 1,要么使得生产一块松饼所需的时间减少 1 1 1

注意:不论如何升级烤箱,生产饼干或松饼的时间至少为 1 1 1

请你计算,为了让所有客人都能满意,至少需要升多少级烤箱。

输入格式

第一行包含整数 T T T,表示共有 T T T 组测试数据。

每组数据第一行是空行。

第二行包含三个整数 N , t C , t M N,t_C,t_M N,tC,tM

接下来 N N N 行,每行包含三个整数 a i , b i , c i a_i,b_i,c_i ai,bi,ci

输出格式

每组数据输出一行结果,一个整数,表示烤箱需要的最小升级数量。

数据范围

1 ≤ T ≤ 100 1 \le T \le 100 1T100,
1 ≤ N ≤ 100 1 \le N \le 100 1N100,
1 ≤ t C , t M ≤ 1 0 9 1 \le t_C,t_M \le 10^9 1tC,tM109,
1 ≤ a i , b i ≤ 1 0 9 1 \le a_i,b_i \le 10^9 1ai,bi109,
a i + b i ≤ c i ≤ 2 × 1 0 18 a_i+b_i \le c_i \le 2 \times 10^{18} ai+bici2×1018

输入样例:
2

3 7 9
4 3 18
2 4 19
1 1 6

5 7 3
5 9 45
5 2 31
6 4 28
4 1 8
5 2 22
输出样例:
11
6
样例解释

对于第一组数据,贝茜可以对烤箱进行 11 11 11 次升级,其中 4 4 4 次减少饼干制作时间, 7 7 7 次减少松饼制作时间,升级过后制作一块饼干的时间为 3 3 3,制作一块松饼的时间为 2 2 2

这样的话,完成第 1 1 1 个客人的订单需要花费的总时间为 18 18 18,完成第 2 2 2 个客人的订单需要花费的总时间为 14 14 14,完成第 3 3 3 个客人的订单需要花费的总时间为 5 5 5,所有人都可以满意离开。

对于第二组数据,贝茜可以对烤箱进行 6 6 6 次升级,全部用于减少饼干制作时间。


二分答案 + 不等式求交集


AC_code

from math import ceil, floor  
  
def check(mid):  
    l, r = max(0, mid - t2 + 1), min(t1 - 1, mid)  
    for i in range(n):  
        a, b, c = arr[i]  
        tmp = c - a * t1 - b * t2 + b * mid  
        if a == b:  
            if tmp < 0:  
                return 0  
        elif a < b:  
            r = min(r, floor(tmp / (b - a)))  
        else:  
            l = max(l, ceil(tmp / (b - a)))  
    return l <= r  
  
t = int(input())  
for _ in range(t):  
    input()  
    n, t1, t2 = map(int, input().split())  
    arr = [list(map(int, input().split())) for _ in range(n)]  
    l, r = 0, t1 + t2 - 2  
    while l <= r:  
        mid = (l + r) // 2  
        if check(mid):  
            ans = mid  
            r = mid - 1  
        else:  
            l = mid + 1  
    print(ans)


END
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢

相关文章:

  • Qt QML实现弹球消砖块小游戏
  • 从0到1实现项目Docker编排部署
  • 百年匠心焕新居:约克VRF中央空调以科技赋能健康理想家
  • Java多线程基石—内存模型
  • CTF--Web安全--SQL注入之报错注入
  • 单元测试、系统测试、集成测试、回归测试的步骤、优点、缺点、注意点梳理说明
  • TF-IDF:文本挖掘中的关键词提取利器
  • 正则表达式 - 修饰符
  • Jetson Orin NX jupyter lab的安装和使用
  • C语言中的指针与数组:概念、关系与应用
  • 深入解读WT软件湍流强度计算与分析
  • python-leetcode 52.课程表
  • 深入理解 HTML 中的<div>和元素:构建网页结构与样式的基石
  • 方差缩减梯度算法
  • camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)
  • wlwrap 与 rlwrap 的区别对比:图形显示协议的演变
  • Kafka相关的面试题
  • 淘宝商品数据采集一键采集
  • 【数据分享】2000—2024年我国省市县三级逐月归一化植被指数(NDVI)数据(Shp/Excel格式)
  • 自适应二值化及伪影
  • 上海黄浦:新婚夫妻来登记可“摇号”定制无人机表演,每周三对
  • 王楚钦球拍受损,乒乓球裁判揭秘大赛球拍检测
  • 陕西籍青年作家卜文哲爬山时发生意外离世,终年28岁
  • 习近平在河南洛阳市考察调研
  • 去年上海60岁及以上户籍老年人口占总人口的37.6%
  • 习近平:坚持科学决策民主决策依法决策,高质量完成“十五五”规划编制工作