冶炼金属(蓝桥杯)

文章目录

  • 冶炼金属
    • 题目描述
    • 二分查找
      • 难点解释

冶炼金属

题目描述

小蓝有一个神奇的炉子用于将普通金属 O冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V,V 是一个正整数,这意味着消耗 V个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普通金属 O的数目不足 V时,无法继续冶炼。

现在给出了 N条冶炼记录,每条记录中包含两个整数 A 和 B,这表示本次投入了 A 个普通金属 O,最终冶炼出了 B 个特殊金属 X。每条记录都是独立的,这意味着上一次没消耗完的普通金属 O不会累加到下一次的冶炼当中。

根据这 N条冶炼记录,请你推测出转换率 V的最小值和最大值分别可能是多少,题目保证评测数据不存在无解的情况。

输入格式

第一行一个整数 N,表示冶炼记录的数目。

接下来输入 N行,每行两个整数 A、B含义如题目所述。

输出格式

输出两个整数,分别表示 V 可能的最小值和最大值,中间用空格分开。

数据范围

对于 30% 的评测用例,1≤N≤102
对于 60% 的评测用例,1≤N≤103
对于 100% 的评测用例,1≤N≤104,1≤B≤A≤109

输入样例:

3
75 3
53 2
59 2

输出样例:

20 25

样例解释

当 V=20 时,有:⌊ 75 20 \frac{75}{20} 2075 ⌋=3,⌊ 59 20 \frac{59}{20} 2059 ⌋=2,⌊ 53 20 \frac{53}{20} 2053 ⌋=2,可以看到符合所有冶炼记录。

当 V=25 时,有:⌊ 75 25 \frac{75}{25} 2575 ⌋=3,⌊ 59 25 \frac{59}{25} 2559 ⌋=2,⌊ 53 25 \frac{53}{25} 2553 ⌋=2 ,可以看到符合所有冶炼记录。

且再也找不到比 20 更小或者比 25 更大的符合条件的 V 值了。

二分查找

这段代码的目的是为了解决一个具体问题:在给定一系列冶炼记录的情况下,计算将普通金属O冶炼成特殊金属X的转换率V的可能的最小值和最大值。下面是对代码的详细注释:

#include<bits/stdc++.h>
using namespace std;// a数组存储每次冶炼投入的普通金属O的数量,b数组存储对应产出的特殊金属X的数量
int a[10010], b[10010];
int n; // 冶炼记录的数量// 函数check1用于检查给定的转换率mid是否可能是转换率V的最小值
// 即对于所有记录,用a[i]/mid得到的特殊金属X的数量不会大于b[i]
bool check1(int mid) {for(int i=0; i<n; i++) {if(a[i]/mid > b[i]) return false;} return true;
}// 函数check2用于检查给定的转换率mid是否可能是转换率V的最大值
// 即对于所有记录,用a[i]/mid得到的特殊金属X的数量不会小于b[i]
bool check2(int mid) {for(int i=0; i<n; i++) {if(a[i]/mid < b[i]) return false;} return true;
}int main() {cin >> n;int maxn = 0; // 存储所有冶炼记录中投入普通金属O的最大值for(int i=0; i<n; i++) {cin >> a[i] >> b[i];if(a[i] > maxn) maxn = a[i]; // 更新最大值}// 寻找可能的最小转换率Vint l=1, r=maxn;while(l < r) {int mid = l + (r - l) / 2;if(check1(mid)) r = mid; // 如果mid作为转换率可能是最小值,则向左(减小mid)搜索else            l = mid + 1; // 否则向右(增大mid)搜索}cout << l << " "; // 输出可能的最小转换率V// 重置l和r,寻找可能的最大转换率Vl=1, r=maxn;while(l < r) {int mid = l + (r - l + 1) / 2;if(check2(mid)) l = mid; // 如果mid作为转换率可能是最大值,则向右(增大mid)搜索else            r = mid - 1; // 否则向左(减小mid)搜索}cout << l; // 输出可能的最大转换率Vreturn 0;
}

这段代码首先通过输入获取冶炼记录的数量和每条记录的投入与产出量,然后分别定义了两个检查函数check1check2来验证给定的转换率mid是否能满足作为最小值或最大值的条件。最后,利用二分搜索算法分别寻找满足条件的最小和最大转换率,并输出这两个值。

难点解释

bool check1(int mid) {for(int i=0; i<n; i++) {if(a[i]/mid > b[i]) return false;} return true;
}

函数 check1 的目的是确定一个给定的 mid 值是否能作为冶炼转换率 V 的一个可行的最小值。在这个上下文中,mid 是我们正在测试是否作为冶炼转换率的候选数。

在冶炼过程中,普通金属 O 的数量被 V 除以产生特殊金属 X 的数量。在一个有效的冶炼过程中,你不能用比实际更少的 O 产生同样多的 X;换句话说,你不能从不足的 O 中得到过多的 X

这就是 if(a[i]/mid > b[i]) return false; 这行代码的含义。对于每一条记录,如果使用 mid 作为转换率计算出来的 X 的数量(即 a[i]/mid)大于实际产出的 X 的数量(即 b[i]),那么这个 mid 值就过小,不能作为转换率 V 的最小值。

例如,如果你有 75 个 O 和转换率 mid 是 20,那么你将会计算出 75 / 20 = 3X。如果记录显示实际上只产出了 3 个 X,这是合理的,但如果记录显示产出了少于 3 个 X,那么 mid 就不可能是转换率 V 的最小值,因为它给出了一个过高的产出量。

check1 函数检查这个条件是否对于所有记录都是真的。如果是,那么 mid 值至少不会比正确的最小转换率 V 值更小。通过二分搜索算法,我们可以逐步缩小 mid 的范围,直到找到可能的最小转换率 V

结论:最小值里选取最大值,最大值里面选取最小值!

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

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

相关文章

【稳定检索|投稿优惠】2024年生物学与智能计算国际会议 (ICBIC 2024)

2024年生物学与智能计算国际会议 (ICBIC 2024) 2024 International Conference on Biology and Intelligent Computing 【会议简介】 2024年生物学与智能计算国际会议即将在上海召开。本次会议旨在汇聚生物学与智能计算领域的专家学者&#xff0c;共同探讨两者交叉融合的前沿…

【Linux】网络基础(一)

文章目录 一、计算机网络背景1. 网络发展2. 认识“协议” 二、网络协议初识1. 协议分层2. OSI七层模型3. TCP/IP五层&#xff08;或四层&#xff09;模型 三、网络传输基本流程1. 同局域网的两台主机通信数据包封装和分用封装分用 2. 跨网络的两台主机通信 四、网络中的地址管理…

【webrtc】源码下载与编译

目录 下载 下依赖 内存需求 &#xff01;&#xff01; 参考文章 &#xff1a; 下载 (1) windows ,centos上都会报错 &#xff08;2&#xff09; ubuntu A : 在git上设置代理 B fetch通过 ubuntu的界面 proxy设置了代理 这将会拉取webRTC源码&#xff0c;且额外加了a…

ssm043基于JavaEE的龙腾公司员工信息管理系统的设计与实现+jsp

龙腾公司员工信息管理系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本龙腾公司员工信息管理系统就是在这样的大环境下诞生&#xff0c;其可…

C++数据结构与算法——动态规划打家劫舍系列

C第二阶段——数据结构和算法&#xff0c;之前学过一点点数据结构&#xff0c;当时是基于Python来学习的&#xff0c;现在基于C查漏补缺&#xff0c;尤其是树的部分。这一部分计划一个月&#xff0c;主要利用代码随想录来学习&#xff0c;刷题使用力扣网站&#xff0c;不定时更…

千视电子携NDI 6前沿技术,亮相北京CCBN展呈现轻量化媒体解决方案

千视携NDI 6技术闪耀2024 CCBN展会&#xff0c;呈现轻量化媒体解决方案 2024年4月24日至26日&#xff0c;北京首钢会展中心将举办第三十届中国国际广播电视网络技术展览会&#xff08;CCBN2024&#xff09;。这是中国广播电视行业的一项重要盛会&#xff0c;将有国内外超600家…

kubectl_入门_Pod配置以及生命周期

Pod配置以及生命周期 1. Pod结构定义 每个pod中都可以包含一个或多个容器&#xff0c;这些容器可以分为两类 用户程序所在的容器&#xff0c;数量可多可少Pause容器&#xff0c;这是每个Pod都会有的一个根容器&#xff0c;它的作用有两个 可以以它为根据&#xff0c;评估整个…

异地两分部子网重复,如何远程更改其中一个分部子网信息

环境: 分部1:子网192.168.1.0/24 分部2:子网192.168.1.0/24 问题描述: 异地两分部子网重复,如何远程更改其中一个分部子网,原本没有问题目前要与总部建ipsec提示冲突无法都建立隧道 解决方案: 先G一下,看看有啥建议 在两个异地分部网络中,如果发现有子网地址出现…

java 解析 xml 字符串转换为实体,实体转换为 xml 字符串

java 解析 xml 字符串转换为实体&#xff0c;实体转换为 xml 字符串 1. XmlCommonUtil工具类代码如下&#xff1a; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; import javax.xml.bind.Unmarshaller;/*** XmlCommonUtil类用于XML字符串和对象之间…

从零开始,如何成功进入IT行业?

0基础如何进入IT行业&#xff1f; 简介&#xff1a;对于没有任何相关背景知识的人来说&#xff0c;如何才能成功进入IT行业&#xff1f;是否有一些特定的方法或技巧可以帮助他们实现这一目标&#xff1f; 在当今数字化时代&#xff0c;IT行业无疑是一个充满活力和机遇的领域。…

Linux服务器疑似被入侵

随着开源产品的越来越盛行&#xff0c;作为一个Linux运维工程师&#xff0c;能够清晰地鉴别异常机器是否已经被入侵了显得至关重要&#xff0c;个人结合自己的工作经历&#xff0c;整理了几种常见的机器被黑情况供参考。 背景信息&#xff1a;以下情况是在CentOS 6.9的系统中…

Leetcode 56. 合并区间和Leetcode 240. 搜索二维矩阵 II

文章目录 Leetcode 56. 合并区间题目描述C语言题解和思路解题思路 Leetcode 240. 搜索二维矩阵 II题目描述C语言题解和思路解题思路 Leetcode 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合…

mac上如何安装python3

mac上如何安装python3&#xff1f; 安装homebrew 在终端执行命令 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 执行完成后&#xff0c;homebrew和pip等工具就自动安装好了。 接下来安装python3.在终端…

C++生成随机数游戏

// 添加随机种子&#xff0c;作用&#xff1a;利用当前系统时间生成随机数&#xff0c;防止每次随机数都一样 srand((unsigned int)time(NULL)); #include <stdio.h> #include <windows.h> #include <iostream> #include <ctime> using namespace std;…

鸿蒙OS开发实例:【Native C++】

介绍 本篇Codelab主要介绍如何使用DevEco Studio创建一个Native C应用。应用采用Native C模板&#xff0c;实现使用NAPI调用C标准库的功能。使用C标准库hypot接口计算两个给定数平方和的平方根。在输入框中输入两个数字&#xff0c;点击计算结果按钮显示计算后的数值。 相关概…

Input Event Daemon:增强Linux输入设备的交互体验

在Linux系统中&#xff0c;设备之间的交互常常需要一些后台进程来监控并响应不同的输入事件&#xff0c;例如键盘按键、鼠标点击或系统唤醒信号。Input Event Daemon&#xff08;简称IED&#xff09;是一个用于Linux的后台服务程序&#xff0c;用以监听来自输入设备的事件&…

lanqiao.602 迷宫

题目&#xff1a; 代码&#xff1a; #include<iostream> #include<cstring> #include<algorithm> #include<queue> using namespace std; char mp[31][51]; //稍微开大一点 char k[4]{D,L,R,U}; //按字典序记录路径 int dirx[]{1,0,0,-1},d…

学习ArkTS -- 常用组件使用

学习ArkTS 使用Deveco studio写ArkTSImage: 图片显示组件1.声明Image组件并设置图片源2. 添加图片属性 Text: 文本显示组件1. 声明Text组件并设置文本内容2. 添加文本属性 TextInput&#xff1a;文本输入框1. 声明TextInput2. 添加属性和事件 Button 组件1. 声明Button组件&…

Linux命令-dpkg-reconfigure命令(Debian Linux中重新配制一个已经安装的软件包)

说明 dpkg-reconfigure命令 是Debian Linux中重新配置已经安装过的软件包&#xff0c;可以将一个或者多个已 安装的软件包传递给此指令&#xff0c;它将询问软件初次安装后的配置问题。 当用户需要再次对软件包配置的时候&#xff0c;可以使用dpkg-reconfigure命令来对指定的软…

关于“使用java中的二维矩阵方法生成二维码“ 以及 “Java加载外部字体文件时出错的原因“

生成二维码 铁铁们,这两日写了一个导出二维码的接口,要求有一个是在二维码下方生成字体,现在奉上生成二维码的代码: controller层 Operation(summary "导出机构二维码",description "导出机构二维码")GetMapping("/orgCode")public void getO…