冶炼金属(二分)

news2024/11/23 3:21:38

题目描述:

小蓝有一个神奇的炉子用于将普通金属 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≤1e2。
对于 60% 的评测用例,1≤N≤1e3。
对于 100% 的评测用例,1≤N≤1e4,1≤B≤A≤1e9。

输入样例:

3
75 3
53 2
59 2

输出样例:

20 25

样例解释:

当 V=20时,有:⌊75/20⌋=3 , ⌊53/20⌋=2,⌊59/20⌋=2,可以看到符合所有冶炼记录。

当 V=25 时,有:⌊75/25⌋=3,⌊53/25⌋=2,⌊59/25⌋=2,可以看到符合所有冶炼记录。

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

分析步骤:

  第一:拿到这道题目读完之后,我们其实可以感觉到这是一个数学问题,所以它存在一个公式如果把它推到出来了就直接套公式就可以解出来问题;但是事实上,求公式非常困难,所以我们也可以换一种方法去做这道题目。我们注意观察,其实金属转化率V其实是单调的。因为当所需要的普通金属越多时,金属转化率越低,这刚好符合 y = 1/x 这个函数的图像,只不过他不连续而是分段的,一段一段有最小值和最大值,在这个区间中,转化得到的特殊金属x是不变个数的。而且中我们从图中可以看出:当V小于Vmin时B都比答案要大,当V大于Vmax时B都要比答案要小,所以我们找到了他的边界条件,注意:我们分析出了单调,边界情况,所以应该想到运用二分法求答案

  第二:书写主函数构建大致框架,首先把值全都输入进去;接着开始二分:我们的左边界我们定义l为1因为题目不会出现无解的情况并且当l为1时可能可以得到最多的特殊金属X我们的右边界定义r为1e9因为题目不会出现无解的情况并且当r为1e9时可能可以得到最少的特殊金属X。所以这是两种极端情况,二分的边界就得是极端情况,得把所有的可能都包括进来。

int main()
{
    cin>>n;
    for(int i = 0 ; i < n ; i++){
        cin>>q[i].x>>q[i].y;
    }
    int l = 1 , r = 1e9;
    while(l < r){
        int mid =(l + r) / 2;
        if(check1(mid)){
            r = mid;
        }else{
            l = mid + 1;
        }
    }
    cout<<l<<" ";
     l = 1 , r = 1e9;
    while(l < r){
        int mid =(l + r + 1) / 2;
        if(check2(mid)){
            l = mid;
        }else{
            r = mid - 1;
        }
    }
    cout<<l<<" ";
    return 0;
}

            进入while循环找Vmin.首先把mid的值算出来,并且判断一下mid的值是否可行,如果可以(计算得出的B 比 答案更小或等于)我们就把 mid 的值 赋值给 r 因为mid有可能是答案而且还有可能有比mid更小的答案所以应该更新区间【l , r(mid)】; 如果 mid 的 值不可行(计算得出的B 比 答案更大) 则把 mid+1 的值赋给 l 因为mid已经确定了不可以,v必须是整数,所以有可能下一个数是正确答案,所以更新区间【l(mid + 1) , r】;

int l = 1 , r = 1e9;
    while(l < r){
        int mid =(l + r) / 2;
        if(check1(mid)){
            r = mid;
        }else{
            l = mid + 1;
        }
    }
    cout<<l<<" ";

              进入while循环找Vmax.首先把mid的值算出来,并且判断一下mid的值是否可行,如果可以(计算得出的B 比 答案更大或等于)我们就把 mid 的值 赋值给 l 因为mid有可能是答案而且还有可能有比mid更大的答案所以应该更新区间【l(mid) , r】; 如果 mid 的 值不可行(计算得出的B 比 答案更小) 则把 mid-1 的值赋给 r 因为mid已经确定了不可以,v必须是整数,所以有可能下一个数是正确答案,所以更新区间【l , r(mid - 1)】;

 l = 1 , r = 1e9;
    while(l < r){
        int mid =(l + r + 1) / 2;
        if(check2(mid)){
            l = mid;
        }else{
            r = mid - 1;
        }
    }
    cout<<l<<" ";

               注意!!:大家可以对照着图片看看,什么情况是可以,什么情况是不可以。另外这两次的mid求值公式不一样,大家记住就行如果mid赋值给l则mid求值公式中要+1,反之则不要。

  第三:书写check1函数(求Vmin),如果q[i].x / mid > q[i].y 则返回false 。等待for循环结束,则返回true。对应的对错中有对应的修改方案。注意我们现在是求Vmin所以应该是>号

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

  第四:书写check2函数(求Vmax)如果q[i].x / mid < q[i].y 则返回false 。等待for循环结束,则返回true。对应的对错中有对应的修改方案。注意我们现在是求Vmin所以应该是<号

bool check2(int mid){
     for(int i = 0 ; i < n ; i ++){
         if(q[i].x / mid < q[i].y) return false;
       }
     return true;
}

  

                             大家还是可以对着图片来观察这道题。更容易理解。 

代码:

#include <iostream>
#include <cstring>
#include <algorithm>
#define x first
#define y second

using namespace std;

typedef long long ll;
typedef pair<ll, ll> PII;
const int N = 1e5+10;
PII q[N];
int n;

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

bool check2(int mid){
     for(int i = 0 ; i < n ; i ++){
         if(q[i].x / mid < q[i].y) return false;
       }
     return true;
}

int main()
{
    cin>>n;
    for(int i = 0 ; i < n ; i++){
        cin>>q[i].x>>q[i].y;
    }
    int l = 1 , r = 1e9;
    while(l < r){
        int mid =(l + r) / 2;
        if(check1(mid)){
            r = mid;
        }else{
            l = mid + 1;
        }
    }
    cout<<l<<" ";
     l = 1 , r = 1e9;
    while(l < r){
        int mid =(l + r + 1) / 2;
        if(check2(mid)){
            l = mid;
        }else{
            r = mid - 1;
        }
    }
    cout<<l<<" ";
    return 0;
}

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

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

相关文章

【机器学习】基于粒子群算法优化的BP神经网络分类预测(PSO-BP)

目录 1.原理与思路2.设计与实现3.结果预测4.代码获取 1.原理与思路 【智能算法应用】智能算法优化BP神经网络思路【智能算法】粒子群算法&#xff08;PSO&#xff09;原理及实现 2.设计与实现 数据集&#xff1a; 多输入多输出&#xff1a;样本特征24&#xff0c;标签类别4…

项目五 实现对学生信息的简单查询

项目五 实现对学生信息的简单查询 1&#xff0c;查询数据库中部分字段的信息 使用select语句对表的选择及连接等操作&#xff0c;结构会生成一个临时表&#xff0c;将select结果存放到临时表中 查询数据表中所有字段的值 #格式&#xff1a;(*:表示所有列) select * from 表…

milvus安装

milvus安装 sudo curl -L “https://github.com/docker/compose/releases/download/1.29.2/docker-compose- $ (uname -s)- $ (uname -m)” -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose sudo ln -s /usr/local/bin/docker-compose /usr/bin/…

SpringBoot项目通过触发器调度实现定时任务

文章目录 前言一、quartz是什么&#xff1f;二、quartz中核心概念三、集成步骤1.引入依赖2.demo样例a.定义一个任务参数实体类b.定义操作触发器、定时任务接口及实现c.作业实现d.结果截图 四、其他1.QuartzJobBean和Job区别2.注意事项3.作业&#xff08;Job&#xff09;和触发器…

考虑功率均分与电压频率的事件触发分布式二次控制MATLAB模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介 此模型是在《基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型》上进一步创作的&#xff0c;之前的模型只考虑了二次电压与频率控制&#xff0c;并没有考虑均分这一项点。 因此…

STM32相关资料汇总

STM32选型表 STM32手册参考网站 https://www.stmcu.org.cn/

文件包含漏洞之包含NGINX日志文件(常用)

条件&#xff1a;知道目标服务器的日志文件存贮路径&#xff0c;并且存在文件包含漏洞 首先对目标服务器发送一次含有木马的请求&#xff0c;目的是让目标服务器日志中生成含有木马的日志记录。因为发送过程中&#xff0c;使用了url编码&#xff0c;我们抓包进行更改成能够执行…

网络——入门基础

目录 协议 网络协议 OSI七层模型 网络传输基本流程 网络传输流程图 局域网通信 数据包的封装和解包 广域网通信 网络地址管理 IP地址 MAC地址 协议 关于什么是局域网&#xff0c;什么是广域网&#xff0c;我这里就不过多赘述了&#xff0c;我们直接来谈一下什么…

复旦发布层次性奖励学习框架,增强大模型人类偏好对齐

在人工智能领域&#xff0c;强化学习&#xff08;Reinforcement Learning, RL&#xff09;一直是实现智能体自主学习的关键技术之一。通过与环境的交互&#xff0c;智能体能够自我优化其行为策略&#xff0c;以获得更多的奖励。然而&#xff0c;当涉及到复杂的人类偏好时&#…

codeforces 1600分

文章目录 1.[G. Special Permutation](https://codeforces.com/problemset/problem/1352/G)2.[D. Constructing the Array](https://codeforces.com/problemset/problem/1353/D)3.[C2. k-LCM (hard version)](https://codeforces.com/problemset/problem/1497/C2)4.[C. Circle …

【ollama】linux、window系统更改模型存放位置,全网首发2024!

首先是window系统 so easy 直接进入系统环境变量添加就行 其次是linux系统 全靠自己试出来的&#xff0c;去Ollama官网找半天文档不知道在哪&#xff0c;而且linux也没有说&#xff1a;【 https://github.com/ollama/ollama/blob/main/docs/README.md https://github.com/o…

CSS Module

CSS Module的作用&#xff1a;将CSS样式作用域限制在特定的组件范围内&#xff0c;以避免全局样式污染和命名冲突。 Vue中如何实现样式模块…

一款博客网站源码

一款博客网站源码 源码软件库 为大家内置了主题 清爽又强大真正的永久可用的一条源码&#xff0c;该版本为整合版本&#xff0c;内置了Joe主题&#xff0c;搭建后直接启用即可~ 安装环境要求&#xff1a; PHP 7.2 以上 MySQL, PostgreSQL, SQLite 任意一种数据库支持&#xff…

BUUCTF-WEB1

[ACTF2020 新生赛]Exec1 1.打开靶机 是一个ping命令 2.利用管道符“|” ping一下本地主机并查看ls ping 127.0.0.1 | ls 可以看到回显的内容是一个文件 127.0.0.1 | cat index.php #查看主机下index.php 127.0.0.1 | ls / #查看主机根目录下的文件 看的一个flag文件 …

专升本 C语言 万字考点笔记全国通用

前言 全章内容多次校验整理,可以放心食用;如果发现内容有不严谨的地方,请随时私信张三xy 形而上学者谓之道&#xff0c;形而下学者谓之器 目录 前言 常考概念 一、C语言的基础知识 第一节、对C语言的基础认识 第二节、C语言程序生命周期 第三节、标识符 第四节、进制的转…

帆软笔记整理

一&#xff1a;表格值自定义显示 1、日期型格式化&#xff1a;FORMAT($$$,"MM月dd日") 或者&#xff1a; 2、普通值自定义显示&#xff1a;if($$$SW_1,丝网一号机,if($$$SW_2,丝网二号机,丝网三号机)) 或者&#xff1a; 二&#xff1a;从数据集中再次筛选&#…

Wireshare捕获接口中没有本地连接

1. 查看npf服务是否启动 服务名无效&#xff0c;需要安转WinPcap 2. 勾选Npcap Packet Driver (NPCAP) 3. 重新启动Wireshark 重新启动Wireshark后&#xff0c;本地连接有了

吴恩达机器学习-可选实验室:简单神经网络(Simple Neural Network)

在这个实验室中&#xff0c;我们将使用Tensorflow构建一个小型神经网络 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.laye…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω&#xff3c;*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω&#xff3c;*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω&#xff3c;)(///) C&#xff1a;继承&#xff1a;面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

联合和枚举

联合体类型的声明 联合体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;它允许在同一内存位置存储不同类型的数据。与结构体不同的是&#xff0c;联合体的所有成员共享同一块内存空间&#xff0c;因此联合体的大小取决于它最大的成员的大小。 所以联合体也叫…