[USACO23FEB] Bakery S

news2025/6/10 16:42:46

题目描述

Bessie 开了一家面包店!

在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC 的时间内生产一块饼干或在 t M t_M tM 单位时间内生产一块松糕。
( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1tC,tM109)。由于空间限制,Bessie 一次只能生产一种糕点,所以要生产 A A A 块饼干和 B B B 块松饼,需要 A ⋅ t C + B ⋅ t M A\cdot t_C+B\cdot t_M AtC+BtM 单位的时间。

Bessie的 N ( 1 ≤ N ≤ 100 ) N (1\le N\le 100) N(1N100) 朋友都想一个一个地去面包店。第 i i i 个朋友一进门就会点 a i ( 1 ≤ a i ≤ 10 9 ) a_i(1 \le a_i \le 10^9) ai(1ai109) 块饼干和 b i ( 1 ≤ b i ≤ 10 9 ) b_i(1 \le b_i \le 10^9) bi(1bi109) 块松饼。Bessie 没有空间来储存糕点,所以她只有在接到订单后才开始制作糕点。此外,Bessie 的朋友都很忙,所以第 i i i 个朋友只愿意等 c i ( a i + b i ≤ c i ≤ 2 ⋅ 10 18 ) c_i(a_i+b_i \le c_i \le 2 \cdot 10^{18}) ci(ai+bici21018) 个单位的时间,然后就伤心地离开。

Bessie 真的不希望她的朋友们伤心,她可以用一块钱升级她的烤箱,让它少花一个单位的时间来生产一块饼干或少花一个单位的时间来生产一个松饼。她不能将她的烤箱升级到花费小于等于 0 0 0 的时间,但她可以选择在她的朋友到来之前将她的烤箱升级多少次,只要生产一块饼干和生产一个松饼所需的时间都严格保持为正数。

对于每一个 T ( 1 ≤ T ≤ 100 ) T(1\le T\le 100) T(1T100) 的测试案例,请帮助 Bessie 找出她必须花费的最小的钱数量,以便她的面包店能够满足所有的朋友。

输入格式

第一行包含 T T T,测试案例的数量。

每个测试用例都以一行开始,包含 N N N, t C t_C tC, t M t_M tM。然后,接下来的 N N N 行各包含三个整数 a i , b i , c i a_i,b_i,c_i ai,bi,ci

测试案例用换行符隔开。

输出格式

Bessie 需要为每个测试案例花费的最少钱数,每行一个。

样例解释 1

在第一个测试案例中,贝西可以支付 11 11 11 元来减少 4 4 4 单位生产一块饼干所需的 时间和 7 7 7 单位生产一块松饼所需的时间,从而使她的烤箱在 3 3 3 单位的时间内生产饼干,在 2 2 2 单位的时间内生产松饼。那么她可以在 18 18 18 单位的时间内满足第一个朋友,在 14 14 14 单位的时间内满足第二个朋友,在 5 5 5 单位的时间内满足第三个朋友,所以他们都不会伤心而离开。

在第二个测试案例中,贝西应该把生产一块饼干的时间减少 6 6 6 单位,把生产一块松饼的时间减少 0 0 0 单位。

数据规模与约定

  • 输入 2 − 4 2-4 24 N ≤ 10 , t C , t M ≤ 1000 N\le 10,t_C,t_M \le 1000 N10,tC,tM1000
  • 输入 5 − 11 5-11 511,没有额外的约束。

输入 1

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

输出 1

11
6

解析

错误想法:读完题考虑到如果饼干机升级 k k k 次满足答案,那么 k − 1 k-1 k1 肯定也满足,所以最开始就想着对饼干机的速度进行二分答案,然后算出面包机的最小升级次数,然后对答案取 m i n min min,WA了,原因是题目要求是两个机器升级次数的和最少,因此对于单单一个机器二分答案,得到的两者升级次数并不具有单调性,因此不正确。

正确想法:设饼干机和面包机的速率分别为 x , y x,y x,y,可以发现二分 x + y x+y x+y 是单调的,因为题目要求速度不能减少为 0 0 0,因此 x + y x+y x+y 最小值为 2 2 2,最大值为 t x + t y tx+ty tx+ty,也就是我们二分的左右边界,现在问题是 check 函数怎么验证合法性?

对于任意的 i i i,都需要满足 a x + b y ≤ c ax+by\leq c ax+byc,等价于 a x − b x ≤ c − b x − b y ax-bx\leq c-bx-by axbxcbxby,再等价于 ( a − b ) x ≤ c − b ( x + y ) (a-b)x\leq c-b(x+y) (ab)xcb(x+y),而自己 x + y x+y x+y 又刚好是我们二分的值,因此未知数只有一个 x x x,因为是不等式,所以我们需要考虑 ( a − b ) (a-b) (ab) 的正负性。

  • 如果 a > b a>b a>b,那么 x ≤ ( c − b ( x + y ) ) / ( a − b ) x\leq (c-b(x+y))/(a-b) x(cb(x+y))/(ab),因为要求速度为正整数,因此需要向取整。
  • 如果 a < b a<b a<b,那么 x ≥ ( c − b ( x + y ) ) / ( a − b ) x\geq (c-b(x+y))/(a-b) x(cb(x+y))/(ab),因为要求速度为正整数,因此需要向取整。
  • 如果 a = = b a==b a==b,那么左边式子为 0 0 0,仅需要满足右边式子大于等于 0 0 0 即可满足不等式,如果右边式子小于 0 0 0,那么表示不合法。

遍历完之后我们可以得到 x x x 的左右取值范围 x l , x r x_l,x_r xl,xr,怎么证明解合法呢,需要满足以下条件。

  • 因为题目要求速度不能少于 1 1 1,因此 x x x 最小为 1 1 1,最大不超过 x + y − 1 x+y-1 x+y1
  • 左边界肯定得小于等于右边界,因此 x l ≤ x r x_l\leq x_r xlxr
  • 右边界不能低于 1 1 1,左边界不能高于 t x tx tx,因此 x r ≥ 1 x_r \geq 1 xr1 x l ≤ t x x_l \leq tx xltx
  • 我们的对象都是饼干机 x x x,但同时也需要满足面包机 y y y 也要合法,因此需要满足 x + y − x r ≤ t y x+y-x_r\leq ty x+yxrty

此时我们就完成了 check 函数的验证,二分求出 x + y x+y x+y 的最大值就可以获得最小花费。

代码实现

//#pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pi acos(-1)
const int N = 1e6 + 5, mod = 1e9 + 7;
typedef long long ll;
typedef pair<int, int> PII;
ll n, tx, ty, a[N], b[N], c[N];
bool check(ll sum) {//x + y的速度
	ll x_l = 1, x_r = sum - 1;
	for (int i = 1; i <= n; i++) {
		if (a[i] > b[i]) x_r = min(x_r, (c[i] - b[i] * sum) / (a[i] - b[i]));
		else if (a[i] < b[i]) x_l = max(x_l, (ll)ceil((c[i] * 1.0 - b[i] * sum) / (a[i] - b[i])));
		else if (c[i] - b[i] * sum < 0) return false;
	}
	if (x_l > x_r || x_r < 1 || x_l > tx || sum - x_r > ty) return false;
	return true;
}
void solve()
{
	scanf("%lld%lld%lld", &n, &tx, &ty);
	for (int i = 1; i <= n; i++) scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
	ll l = 2, r = tx + ty, ans = -1;
	while (l <= r) {
		ll mid = l + r >> 1;
		if (check(mid)) ans = mid, l = mid + 1;
		else r = mid - 1;
	}
	printf("%lld\n", tx + ty - ans);
}
int main()
{
	// freopen("input.txt","r",stdin);
	// freopen("output.txt","w",stdout);
	int t = 1;
	scanf("%d", &t);
	while (t--) solve();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…