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

【蓝桥杯集训·每日一题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
如果有更多问题或需要进一步的帮助,可以在评论区留言讨论哦!
如果喜欢的话,请给博主点个关注 谢谢


http://www.kler.cn/a/585311.html

相关文章:

  • Android LeakCanary使用与原理深度解析
  • R语言基础| 高级数据管理
  • mne溯源相关说明
  • ChatGPT、DeepSeek、Grok 三者对比:AI 语言模型的博弈与未来
  • RTSP/Onvif视频安防监控平台EasyNVR调用接口返回匿名用户名和密码的原因排查
  • Linux内核实时机制19 - RT调度器3 - 实时任务出入队
  • 【vLLM 学习】使用 TPU 安装
  • C++11 编译使用 aws-cpp-sdk
  • HTTP相关问题(AI回答)
  • 前端开发中的设计模式:装饰器模式的应用与实践
  • IDEA 一键完成:打包 + 推送 + 部署docker镜像
  • Python区块链应用开发从入门到精通
  • 深入理解 Python 中的进程池
  • leetcode203.移除链表元素
  • android 新闻客户端和springboot后台开发(一)
  • vue2:el-table列中文字前面加icon图标的两种方式
  • vue uniapp里照片多张照片展示
  • 论文阅读笔记——LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  • 【RISCV LAB】0x01-安装实验仿真辅助工具
  • AI建模智能生成:从2D到3D,AI只需一步!