目录

  • 题目内容
  • 二分法
    • 解析
      • 代码
  • 公式法
    • 解析
      • 代码

题目内容

小蓝有一个神奇的炉子用于将普通金属 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 % 30\% 30% 的评测用例, 1 ≤ N ≤ 1 0 2 1≤N≤10^2 1≤N≤102。
对于 60 % 60\% 60% 的评测用例, 1 ≤ N ≤ 1 0 3 1≤N≤10^3 1≤N≤103。
对于 100 % 100\% 100% 的评测用例, 1 ≤ N ≤ 1 0 4 , 1 ≤ B ≤ A ≤ 1 0 9 1≤N≤10^4,1≤B≤A≤10^9 1≤N≤104,1≤B≤A≤109。

输入样例:

3
75 3
53 2
59 2

输出样例:

20 25

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

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

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

二分法

解析

我们可以把 ⌊ A V ⌋ = B ⌊\frac{A}{V}⌋ = B ⌊VA​⌋=B看成一个函数,把 V V V当作自变量, B B B当作因变量,容易知道,这是一个反比例函数的形状,但是由于下取整,所以实际上以一个下降的分段函数
满足条件的v一定是在一段区间上,则满足这一条记录的v的最小值即为这段区间的左端点。分析到这里,这道题目的单调性就被发现了,我们这时采用二分查找即可找到min,再取所有记录的min中最大的一个,即为整体的min
对于max,由于它位于区间的右端点,我们也可以重新写一个二分查找去寻找右端点,但代码量增加,可以采取一个转化,仍然使用同一个二分查找的函数。我们寻找满足B + 1的下一个区间的左端点,此时找到的是满足 ⌊ A V ′ ⌋ = B − 1 ⌊\frac{A}{V^\prime}⌋ = B - 1 ⌊V′A​⌋=B−1,其中可以发现这样的操作会使得 V ′ = V + 1 V^\prime = V + 1 V′=V+1,因此返回的端点-1即可,最后取所有记录中最小的一个,即为整体的max

代码

要注意二分查找中l和r的初始化取值

#include <bits/stdc++.h>using namespace std;int binary_search(int a, int b)
{int l = 1, r = 2e9 + 1; //由于b存在等于0的情况,也就是说当a = 2e9,b = 0的时候,//v必须能取到比a还大的数字,因此要加一while(l < r){int mid = (l + r) >> 1;if(a / mid <= b) r = mid; //这里和正常的二分查找是相反的,因为查找的数字在分母上else l = mid + 1;}return l;
}int main()
{int n;cin >> n;int v_max = 1e9, v_min = 1; //当A取最大,B取最小的时候可得到最大值1e9,相等的时候取最小值1while(n --){int a, b;scanf("%d %d", &a, &b);v_max = min(v_max, binary_search(a, b - 1) - 1); //这里是转化为下一个区间的左端点-1v_min = max(v_min, binary_search(a, b));}printf("%d %d", v_min, v_max);return 0;
}

公式法

解析

首先我们先列出题目中要求的公式
⌊ A V ⌋ = B ⌊\frac{A}{V}⌋ = B ⌊VA​⌋=B
根据下取整的性质,我们有
⌊ A V ⌋ + 1 = B + 1 > A V ≥ ⌊ A V ⌋ = B ⌊\frac{A}{V}⌋ + 1 = B + 1 > \frac{A}{V} \geq ⌊\frac{A}{V}⌋ = B ⌊VA​⌋+1=B+1>VA​≥⌊VA​⌋=B
进行不等式的简单变换得到
A B ≥ V > A B + 1 \frac{A}{B} \geq V > \frac{A}{B + 1} BA​≥V>B+1A​
到这里结果就非常明显了,我们只需要寻找 ⌊ A B ⌋ ⌊\frac{A}{B}⌋ ⌊BA​⌋的最小值作为max,由于V是整数,所以min一定是大于 A B + 1 \frac{A}{B + 1} B+1A​的最小整数,当 A B + 1 \frac{A}{B +1} B+1A​是整数的时候,直接取 A B + 1 + 1 \frac{A}{B+1} + 1 B+1A​+1即可,如果不是整数,则取 ⌊ A B + 1 ⌋ + 1 ⌊\frac{A}{B + 1}⌋ + 1 ⌊B+1A​⌋+1,在C++中这两种操作可以合并。

代码

#include <bits/stdc++.h>using namespace std;int n;int main()
{cin >> n;int maxs = 0x3f3f3f3f, mins = 0;for(int i = 0; i < n; i ++){int a, b;scanf("%d %d", &a, &b);maxs = min(maxs, a / b);mins = max(mins, a / (b + 1) + 1); //这里是合并的操作}printf("%d %d", mins, maxs);return 0;
}

第十四届蓝桥杯C++ B组——冶炼金属相关推荐

  1. 2023.05.14十四届蓝桥杯青少组中高级组省赛Python

    蓝桥杯大赛青少组 第十四届蓝桥杯Python中级组省赛 选择题: T1. 编程题  LQSS14PB01 时间限制: 3000MS 内存限制: 589824KB 题目描述:(注.input()输入函数 ...

  2. 2023年第十四届蓝桥杯C++B组复盘

    第十四届蓝桥杯C++B组复盘 A: 日期统计(5分) 问题描述 思路 B: 01 串的熵(5分) 问题描述 思路 C: 冶炼金属(10分) 问题描述 输入格式 输出格式 样例输入 样例输出 样例说明 ...

  3. 第十四届蓝桥杯集训——JavaC组第九篇——位运算符

    第十四届蓝桥杯集训--JavaC组第九篇--位运算符 目录 第十四届蓝桥杯集训--JavaC组第九篇--位运算符 值交换 异或值交换 其它位移符号: 这个稍微难度大一些,基础的有[&与.|或. ...

  4. 十四届蓝桥杯青少组选拔赛Python_2023.02.12

    十四届蓝桥杯青少组选拔赛Python_2023.02.12 2023年2月12日Python中高级在线考试   单选题 1. 关于Python3.10,下列选项描述正确的是( B ). *选择题严禁使 ...

  5. 2023年第十四届蓝桥杯JAVA B组题目

    第二次参加蓝桥杯,手机再次没电导致只写了两个半小时就交了(不能重复交哎),这次带了充电宝,结果充电宝充电线中途松了,不得不说腾讯会议的耗电量真大.本博客就是刚提交后写的,可以看看时间hhh. 就做了前 ...

  6. 第十四届蓝桥杯C++B组题解(不完全对)

    A直接暴力枚举 答案235 #include<bits/stdc++.h> #define int long long #define db double #define PII pair ...

  7. 第十四届蓝桥杯第一期模拟赛 python

    第十四届蓝桥杯python第一期模拟赛 文章目录 第十四届蓝桥杯python第一期模拟赛 1. 二进制位数 问题描述 答案提交 思路 参考答案 2. 晨跑 问题描述 答案提交 思路 参考答案 3. 调 ...

  8. 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解

    本篇文章对第十四届蓝桥杯第三期模拟赛所有的题目进行了详细解析.如果大家还想刷题的话,我给大家整理出了第十二届的省赛真题:第十二届省赛C/C++ B组真题.推荐大家可以去做一下. 文章目录 一.填空题 ...

  9. 第十四届蓝桥杯要开始了(2022年)

    今天来安利一个计算机类的算法比赛,不能说是"安利",因为基本上每一个计算机专业的学生都知道这个比赛. 这个比赛的名气大到根本不需要我安利.... 1.多去参加一些竞赛或者社团活动 ...

最新文章

  1. python中可以用中文作为变量-python里能不能用中文
  2. Dubbo错误排查:com.alibaba.dubbo.rpc.RpcException: Invoke remote method timeout
  3. 关注信息安全认证培训
  4. Python for Data Analysis 学习心得(二) - pandas介绍
  5. 判断给定的两个数是否是亲和数_动画演示LeetCode算法题:004-寻找两个有序数组的中位数...
  6. 微课系列(5):Python程序中__name__变量的用法
  7. css取消聚焦边框[Chrome,Safari]
  8. 基于Opencv的手写字识别
  9. CSDN下载频道1月最受欢迎资源强力推荐~!
  10. 必看!100道Java程序员面试题(含答案)!
  11. [境内法规]中国人民银行关于分支行反洗钱工作的指导意见—银发[2005]56号
  12. Android 开发环境搭建
  13. 在Word中上下两张表格合并不了的解决办法
  14. 解一元二次方程-Java语言实现
  15. 使用phpword实现php生成word文件同时以邮件的形式发送word附件
  16. 数码视讯q5运行u盘armbian
  17. 使用VScode简易编程
  18. android 仿苹果 小组件,仿ios14桌面小部件
  19. 手机重启后android要输入pin,手机这个密码必须设,否则危险!99%的人不知道!...
  20. Oracle insert语句慢的背后

热门文章

  1. (七)RewriteCond 语法说明Flag[NC,OR] CondPattern 使用说明
  2. UML实现图 组件图、配置图
  3. centos安装ss5
  4. 2021-12-9 《聪明的投资者》学习笔记-6.积极型投资者的证券组合策略:被动的方法(指出他们不应该去做哪些事-需要金融知识基础)
  5. 相濡以沫非真性----读《庄子》有感
  6. PHP构造函数是什么
  7. 从外观到体验 真假戴森吹风机差距有多大?
  8. 个人Web项目上线教程
  9. 解决PyCharm不在run输出运行结果,而不是再Console里输出
  10. qt学习之sender