【洛谷 P3743】kotori的设备 题解(二分答案+递归)

kotori的设备

题目背景

kotori 有 n n n 个可同时使用的设备。

题目描述

i i i 个设备每秒消耗 a i a_i ai 个单位能量。能量的使用是连续的,也就是说能量不是某时刻突然消耗的,而是匀速消耗。也就是说,对于任意实数,在 k k k 秒内消耗的能量均为 k × a i k\times a_i k×ai 单位。在开始的时候第 i i i 个设备里存储着 b i b_i bi 个单位能量。

同时 kotori 又有一个可以给任意一个设备充电的充电宝,每秒可以给接通的设备充能 p p p 个单位,充能也是连续的,不再赘述。你可以在任意时间给任意一个设备充能,从一个设备切换到另一个设备的时间忽略不计。

kotori 想把这些设备一起使用,直到其中有设备能量降为 0 0 0。所以 kotori 想知道,在充电器的作用下,她最多能将这些设备一起使用多久。

输入格式

第一行给出两个整数 n , p n,p n,p

接下来 n n n 行,每行表示一个设备,给出两个整数,分别是这个设备的 a i a_i ai b i b_i bi

输出格式

如果 kotori 可以无限使用这些设备,输出 − 1 -1 1

否则输出 kotori 在其中一个设备能量降为 0 0 0 之前最多能使用多久。

设你的答案为 a a a,标准答案为 b b b,只有当 a , b a,b a,b 满足
∣ a − b ∣ max ⁡ ( 1 , b ) ≤ 1 0 − 4 \dfrac{|a-b|}{\max(1,b)} \leq 10^{-4} max(1,b)ab104 的时候,你能得到本测试点的满分。

样例 #1

样例输入 #1

2 1
2 2
2 1000

样例输出 #1

2.0000000000

样例 #2

样例输入 #2

1 100
1 1

样例输出 #2

-1

样例 #3

样例输入 #3

3 5
4 3
5 2
6 1

样例输出 #3

0.5000000000

提示

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 100000 1\leq n\leq 100000 1n100000 1 ≤ p ≤ 100000 1\leq p\leq 100000 1p100000 1 ≤ a i , b i ≤ 100000 1\leq a_i,b_i\leq100000 1ai,bi100000


思路

在main()函数中,通过循环读取输入,并计算设备的总耗能速度sum。如果总耗能速度sum小于等于设备充电速度p,则输出-1,表示无法满足设备的需求。调用partition()函数,传入初始区间[0, 1e10],并输出最小的满足所有需求的时间l。

不妨假设电池是有容量的,容量为时间x和电池放电速度p的乘积。通过check函数判断在时间x内电池电量剩余情况。如果电池还有剩余电量,那么时间太短,需要增加时间;如果电池没有剩余电量,那么时间太长,需要减少时间。

在递归函数partition()中,首先判断当前区间的长度是否满足终止条件,即r - l <= 1e-5。如果满足条件,则输出当前的l值,并返回。通过check函数判断在时间x内电池电量剩余情况。如果时间太长,需要将区间的右边界r更新为mid,并递归调用partition()函数。如果时间太短,需要将区间的左边界l更新为mid,并递归调用partition()函数。

注意:精度不用控制太严格,否则会超时。只要当 a , b a,b a,b 满足
∣ a − b ∣ max ⁡ ( 1 , b ) ≤ 1 0 − 4 \dfrac{|a-b|}{\max(1,b)} \leq 10^{-4} max(1,b)ab104 的时候,就能得到本测试点的满分。


AC代码

#include <iostream>
#define AUTHOR "HEX9CF"
using namespace std;const int N = 1e6 + 7;// 设备
int n;
// 电池充电速度
double p;
// 每秒耗能,存储能量
double a[N], b[N];bool check(double x) {double bat = p * x;for (int i = 1; i <= n; i++) {if (a[i] * x <= b[i]) {// 自身电量够用continue;}bat -= a[i] * x - b[i];}// cout << x << " " << bat << endl;return bat < 0;
}void partition(double l, double r) {if (r - l <= 1e-5) {cout << l << endl;return;}double mid = (l + r) / 2;if (check(mid)) {// 时间太长r = mid;partition(l, mid);} else {// 时间太短partition(mid, r);}
}int main() {cin >> n >> p;double sum = 0;for (int i = 1; i <= n; i++) {cin >> a[i] >> b[i];sum += a[i];}if (sum <= p) {// 总放电速度不高于充电速度cout << -1 << endl;return 0;}partition(0, 1e10);return 0;
}

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

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

相关文章

60 权限提升-MYMSORA等SQL数据库提权

目录 数据库应用提权在权限提升中的意义WEB或本地环境如何探针数据库应用数据库提权权限用户密码收集等方法目前数据库提权对应的技术及方法等 演示案例Mysql数据库提权演示-脚本&MSF1.UDF提权知识点: (基于MYSQL调用命令执行函数&#xff09;读取数据库存储或备份文件 (了…

记录 ubuntu 硬盘分区跟格式化(fdisk命令)

1、sudo su 2、fdisk -l 查找需要挂载的硬盘是哪一个 3、fdisk /dev/sda 可以输入m&#xff0c;查看帮助信息&#xff0c;按p&#xff0c;查看磁盘分区信息 输入n&#xff0c;选择分两个区&#xff08;原来已经有一个&#xff0c;再加1个就是2两个&#xff09;&#xff0c…

GaussDB新特性Ustore存储引擎介绍

1、 Ustore和Astore存储引擎介绍 Ustore存储引擎&#xff0c;又名In-place Update存储引擎&#xff08;原地更新&#xff09;&#xff0c;是openGauss 内核新增的一种存储模式。此前的版本使用的行存储引擎是Append Update&#xff08;追加更新&#xff09;模式。相比于Append…

在网络攻击之前、期间和之后应采取的步骤

在当今复杂的威胁形势下&#xff0c;网络攻击是不可避免的。 恶意行为者变得越来越复杂&#xff0c;出于经济动机的攻击变得越来越普遍&#xff0c;并且每天都会发现新的恶意软件系列。 这使得对于各种规模和跨行业的组织来说&#xff0c;制定适当的攻击计划变得更加重要。 …

【Linux】进程间通信 -- 管道

对于进程间通信的理解 首先&#xff0c;进程间通信的本质是&#xff0c;让不同的进程看到同一份资源&#xff08;这份资源不能隶属于任何一个进程&#xff0c;即应该是共享的&#xff09;。而进程间通信的目的是为了实现多进程之间的协同。 但由于进程运行具有独立性&#xff…

密码加密解密之路

1.背景 做数据采集&#xff0c;客户需要把他们那边的数据库连接信息存到我们系统里&#xff0c;那我们系统就要尽可能的保证这部分数据安全&#xff0c;不被盗。 2.我的思路 1.需要加密的地方有两处&#xff0c;一个是新增的时候前端传给后端的时候&#xff0c;一个是存到数…

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (三)

内容提要: 如果说,爬取网页数据的时候,我们使用了异步,那么将数据放入redis里面,其实也需要进行异步;当然,如果使用多线程或者redis线程池技术也是可以的,但那会造成冗余; 因此,在测试完多线程redis搭配异步爬虫的时候,我发现效率直接在redis这里被无限拉低下来! 因此: 最终的r…

从0开始学习JavaScript--JavaScript中的集合类

JavaScript中的集合类是处理数据的关键&#xff0c;涵盖了数组、Set、Map等多种数据结构。本文将深入研究这些集合类的创建、操作&#xff0c;以及实际应用场景&#xff0c;并通过丰富的示例代码&#xff0c;帮助大家更全面地了解和应用这些概念。 数组&#xff08;Array&…

福州大学《物联网中间件技术实验》题库选择与实验要求

一、 实验目的 1.掌握中间件系统框架的搭建&#xff1b; 2.掌握JAVA EE服务器开发技术&#xff1b; 二、 实验仪器、开发环境 1.开发工具&#xff1a;MyEclipse Professional&#xff08;注意不是Eclipse&#xff09; 2.开发环境&#xff1a;JDK1.6&#xff0c;MySQL&…

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff…

安全框架springSecurity+Jwt+Vue-1(vue环境搭建、动态路由、动态标签页)

一、安装vue环境&#xff0c;并新建Vue项目 ①&#xff1a;安装node.js 官网(https://nodejs.org/zh-cn/) 2.安装完成之后检查下版本信息&#xff1a; ②&#xff1a;创建vue项目 1.接下来&#xff0c;我们安装vue的环境 # 安装淘宝npm npm install -g cnpm --registryhttps:/…

flask实现session开发

要在Flask应用中实现会话&#xff08;session&#xff09;开发&#xff0c;你可以使用Flask内置的session模块。以下是一个示例代码&#xff0c;演示在Flask应用中启用和使用会话功能&#xff1a; from flask import Flask, session, redirect, url_for, requestapp Flask(__…

软件测试/测试开发/人工智能丨基于Spark的分布式造数工具:加速大规模测试数据构建

随着软件开发规模的扩大&#xff0c;测试数据的构建变得越来越复杂&#xff0c;传统的造数方法难以应对大规模数据需求。本文将介绍如何使用Apache Spark构建分布式造数工具&#xff0c;以提升测试数据构建的效率和规模。 为什么选择Spark&#xff1f; 分布式计算&#xff1a;…

easyExcel注解详情

前言11个注解字段注解 类注解基础综合示例补充颜色总结 11个注解 ExcelProperty ColumnWith 列宽 ContentFontStyle 文本字体样式 ContentLoopMerge 文本合并 ContentRowHeight 文本行高度 ContentStyle 文本样式 HeadFontStyle 标题字体样式 HeadRowHeight 标题高度 HeadStyle…

快速弄懂Python3.10的一些新特性与使用场景

Python 3.10的新特性不仅增强了语言的功能性&#xff0c;也提供了更丰富的工具&#xff0c;让开发者能更高效、更准确地编写代码。接下来将通过一些实际的使用场景和方法来探索这些新特性。 1. “精确类型”参数化内置集合 Python 3.10引入了更精确的方式来指定内置集合的类型…

GoogleTest测试框架-Gest和GMock

在B站和油管上面找到涉及到GoogleTest单元测试框架的Gtest和Gmock的三个不错的视频资源&#xff1a; 油管视频链接&#xff1a; Google Test and Mock Platform, Complete Tutorial. Part 1: Google TestGoogle Test and Mock Platform - Part 2: GMock MatchersGoogle Test …

Python将原始数据集和标注文件进行数据增强(随机仿射变换),并生成随机仿射变换的数据集和标注文件

Python将原始数据集和标注文件进行数据增强&#xff08;随机仿射变换&#xff09;&#xff0c;并生成随机仿射变换的数据集和标注文件 前言前提条件相关介绍实验环境生成随机仿射变换的数据集和标注文件代码实现输出结果 前言 由于本人水平有限&#xff0c;难免出现错漏&#x…

OpenCV快速入门:图像滤波与边缘检测

文章目录 前言一、噪声种类与生成1.1 椒盐噪声1.2 高斯噪声1.3 彩色噪声 二、卷积操作2.1 卷积基本原理2.2 卷积操作代码实现 三、线性滤波3.1 均值滤波均值滤波原理均值滤波公式均值滤波代码实现 3.2 方框滤波方框滤波原理方框滤波公式方框滤波代码实现 3.3 高斯滤波高斯滤波原…

redis非关系型数据库(缓存型数据库)——中间件

【重点】redis为什么这么快&#xff1f;&#xff08;应届&#xff09; ①redis是纯内存结构&#xff0c;避免磁盘I/O的耗时 ②redis核心模块是一个单进程&#xff0c;减少线程切换和回收线程资源时间 ③redis采用的是I/O的多路复用机制&#xff08;每一个执行线路可以同时完…

java面试八股文2023完整版详解110题附带答案

以下是一份Java面试八股文2023&#xff0c;涵盖了Java编程语言的核心概念和常用技术&#xff0c;帮助你更好地准备面试。 1. Java语言有哪些特点&#xff1f; Java语言是一种面向对象的编程语言&#xff0c;具有简单、面向对象、分布式、多线程、动态等优点。它是一种跨平台的…