【秋招刷题打卡】Day03-二分系列之-二分答案

Day03-二分系列之-二分答案

给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦,详细介绍 =>笔试刷题陪伴小屋-打卡赢价值丰厚奖励 <=

⏰小屋将在每日上午发放打卡题目,包括:

  • 一道该算法的模版题 (主要以力扣,牛客,acwing等其他OJ网站的题目作为模版)
  • 一道该算法的应用题(主要以往期互联网大厂 笔试真题 的形式出现,评测在咱们的 笔试突围OJ

在这里插入图片描述

小屋day03

咱们的二分系列用的都是 day02 的二分模版~

二分模版介绍:二分模版

有小伙伴可能会问了,既然系统有自带的二分库,为什么我们还要自己手写二分呢?清隆认为主要有以下两点

  • 在二分的其他应用中,手写二分更利于设置 check 条件和实现具体逻辑
  • 加深对二分的理解和提高代码熟练度

今天给大家带来二分答案相关的题

前言

什么是二分答案

说直白点其实就是先 一个答案,然后通过check函数来检查这个答案 是否合法,继而跟新二分的左右端点。

能够二分答案的题需要题目满足具有一定的性质,如单调性、二段性等等。

🎀 模版题

2187. 完成旅途的最少时间

题目描述

给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟 旅途 所需要花费的时间。

每辆公交车可以 连续 完成多趟旅途,也就是说,一辆公交车当前旅途完成后,可以 立马开始 下一趟旅途。每辆公交车 独立 运行,也就是说可以同时有多辆公交车在运行且互不影响。

给你一个整数 totalTrips ,表示所有公交车 总共 需要完成的旅途数目。请你返回完成 至少 totalTrips 趟旅途需要花费的 最少 时间。

示例 1:

输入:time = [1,2,3], totalTrips = 5
输出:3
解释:
- 时刻 t = 1 ,每辆公交车完成的旅途数分别为 [1,0,0] 。已完成的总旅途数为 1 + 0 + 0 = 1 。
- 时刻 t = 2 ,每辆公交车完成的旅途数分别为 [2,1,0] 。已完成的总旅途数为 2 + 1 + 0 = 3 。
- 时刻 t = 3 ,每辆公交车完成的旅途数分别为 [3,1,1] 。已完成的总旅途数为 3 + 1 + 1 = 5 。
所以总共完成至少 5 趟旅途的最少时间为 3 。

示例 2:

输入:time = [2], totalTrips = 1
输出:2
解释:
只有一辆公交车,它将在时刻 t = 2 完成第一趟旅途。
所以完成 1 趟旅途的最少时间为 2 。

解题思路

时间越多,可以完成的旅途也就越多,有 单调性,可以二分答案

在二分之前需要设置区间左右端。

  • 左端点:答案的最小可能值

  • 右端点:答案的最大可能值

  • 当然实际运用中,左端点可以设置的更小点也没事,右端点同理

现在我们尝试来进行 答案,假设当前答案为 X:

那么可以完成的旅途数量为: ∑ i = 0 n − 1 ⌊ x t i m e [ i ] ⌋ \sum_{i=0}^{n - 1} \lfloor \frac{x}{time[i]} \rfloor i=0n1time[i]x

如果比 totalTrips 大了,说明 X 还能继续缩小,那么跟新(左移)右端点,否则跟新(右移)左端点。

此时我们发现在 check 函数判断之后 需要跟新的是右端点,所以使用 第一个二分模版

时间复杂度:O(nlog⁡U),其中 n 为time 的长度,U 为 二分设置的区间长度

参考代码

  • Python

    class Solution:def minimumTime(self, time: List[int], totalTrips: int) -> int:l, r = 0, int(1e18) + 10 #  设置左右端点def check(x: int) -> bool:sum = 0for t in time:sum += x // tif sum >= totalTrips:return Truereturn Falsewhile l < r:mid = (l + r) // 2if check(mid):r = midelse:l = mid + 1return l
  • Java

    import java.util.List;class Solution {public long minimumTime(int[] time, int totalTrips) {long l = 0, r = (long)1e18 + 10; // 设置左右端点while (l < r) {long mid = l + (r - l) / 2;if (check(time, mid, totalTrips)) {r = mid;} else {l = mid + 1;}}return l;}private boolean check(int[] time, long x, int totalTrips) {long sum = 0;for (int t : time) {sum += x / t;if (sum >= totalTrips) {return true;}}return false;}
    }
  • Cpp

    class Solution {
    public:long long minimumTime(vector<int>& time, int totalTrips) {long long l = 0, r = 1e18 + 10; // 设置左右端点auto check = [&](long long x) -> bool{long long sum = 0;for(int t : time){sum += x / t;if(sum >= totalTrips) return true;}return false;};while(l < r){long long mid = l + r >> 1; if(check(mid)) r = mid;elsel = mid + 1;}return l;}
    };
    

🍰 笔试真题

  • 该题来自今年 华为春招 的笔试题,出现在笔试第一题。

K小姐的购物系统调度

评测链接🔗

问题描述

K小姐负责维护一个购物系统,该系统面临着来自多个客户端的请求。为了应对系统的性能瓶颈,需要实现一个降级策略,以防止系统超负荷。

系统需要确定一个请求调用量的最大阈值 v a l u e value value。如果所有客户端的请求总量未超过系统的最大承载量 c n t cnt cnt,则所有请求均可正常处理,此时返回 − 1 -1 1。否则,超过 v a l u e value value 的客户端调用量需要被限制在 v a l u e value value,而未超过 v a l u e value value 的客户端可以正常请求。要求计算可以接受的最大 v a l u e value value,以便尽可能地满足更多的请求。

输入格式

第一行包含 n n n 个空格分隔的正整数 R 1 , R 2 , . . . , R n R_1, R_2, ..., R_n R1,R2,...,Rn,表示每个客户端在一定时间内发送的交易请求数量。

第二行包含一个正整数 c n t cnt cnt,表示购物系统的最大调用量。

输出格式

输出一个整数,表示系统能够接受的最大请求调用量的阈值 v a l u e value value

样例输入

1 4 2 5 5 1 6
13

样例输出

2

解释说明

若将 v a l u e value value 设置成 6 6 6 1 + 4 + 2 + 5 + 5 + 1 + 6 > 13 1+4+2+5+5+1+6>13 1+4+2+5+5+1+6>13 不符合。

v a l u e value value 设置为 2 2 2 1 + 2 + 2 + 2 + 2 + 1 + 2 = 12 < 13 1+2+2+2+2+1+2=12<13 1+2+2+2+2+1+2=12<13 符合。

可以证明 v a l u e value value 最大为 2 2 2

评测数据与规模

  • 0 < n ≤ 1 0 5 0 < n \le 10^5 0<n105
  • 0 ≤ R i ≤ 1 0 5 0 \le R_i \le 10^5 0Ri105
  • 0 ≤ c n t ≤ 1 0 9 0 \le cnt \le 10^9 0cnt109

题解

我们先来判断 题目答案是否有 单调性

  1. 当阈值 v a l u e value value 变小时,请求量会被限制会变多,总的请求量就会减小
  2. 当阈值 v a l u e value value 变大时,请求量会被限制会变少,总的请求量就会变大.

所以 v a l u e value value 最大,答案最大,因此答案具有 单调性

因此我们可以尝试 一个答案 x x x

  • 设置 x x x 的左右边界, 左边界可以设置为 0 0 0 ,右边界最大为 m a x ( R i ) max(R_i) max(Ri),其中 0 < i < n 0 < i < n 0<i<n
  • 每次通过 x x x ,对当前的请求量求和,并和 c n t cnt cnt 做比较。
  • 判断当前 x x x 是否满足条件,如果满足,则尝试猜更大的 x x x,即跟新(右移)左端点
  • 因为是右移左端点,所以这里采用二分的 第二个模版

时间复杂度: O ( n log ⁡ ( n ) ) O(n\log(n)) O(nlog(n))

AC代码

  • Java
import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);List<Integer> list = new ArrayList<>();// 读取所有输入的整数while (sc.hasNextInt()) {int x = sc.nextInt();list.add(x);}int[] nums = new int[list.size()];// 将List转为数组for (int i = 0; i < list.size(); i++) {nums[i] = list.get(i);}int left = 0;int maxv = Arrays.stream(nums).max().getAsInt(); // 找到数组中的最大值int right = maxv;// 二分查找最大值while (left < right) {int mid = (left + right + 1) / 2;if (check(nums, mid)) {left = mid;} else {right = mid - 1;}}// 输出结果if (right == maxv) {System.out.println(-1);} else {System.out.println(left);}}// 检查是否满足条件private static boolean check(int[] nums, int value) {long sum = 0;for (int i = 0; i < nums.length - 1; i++) {sum += Math.min(nums[i], value);}return sum <= nums[nums.length - 1];}
}
  • Cpp

    #include <iostream>
    #include <vector>
    #include <algorithm>
    using namespace std;bool check(vector<int>& nums, int value) {long long sum = 0;for (int i = 0; i < nums.size() - 1; ++i) {sum += min(nums[i], value);}return sum <= nums.back(); // nums.back() 返回最后一个元素
    }int main() {vector<int> nums;int x;// 读取所有输入的整数while (cin >> x) {nums.push_back(x);}int left = 0;int maxv = *max_element(nums.begin(), nums.end()); // 找到数组中的最大值int right = maxv;// 二分查找最大值while (left < right) {int mid = (left + right + 1) / 2;if (check(nums, mid)) {left = mid;} else {right = mid - 1;}}// 输出结果if (right == maxv) {cout << -1 << endl;} else {cout << left << endl;}return 0;
    }
  • Python

    def check(nums, value):total = 0for num in nums[:-1]:  # 排除最后一个元素total += min(num, value)return total <= nums[-1]  # 检查条件是否满足def main():import sysinput = sys.stdin.readnums = list(map(int, input().split()))  # 读取所有输入的整数left = 0maxv = max(nums)  # 找到数组中的最大值right = maxv# 二分查找最大值while left < right:mid = (left + right + 1) // 2if check(nums, mid):left = midelse:right = mid - 1# 输出结果if right == maxv:print(-1)else:print(left)if __name__ == "__main__":main()

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

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

相关文章

43 mysql insert select 的实现

前言 我们这里 来探讨一下 insert into $fields select $fields from $table; 的相关实现, 然后 大致来看一下 为什么 他能这么快 按照 我的思考, 应该里里面有 批量插入才对, 但是 调试结果 发现令我有一些意外 呵呵 果然 只有调试才是唯一的真理 测试数据表如下 CREATE…

数字社交的领航者:解析Facebook的引领作用

在当今数字化社会中&#xff0c;社交网络已经成为了人们日常生活不可或缺的一部分。而在众多社交平台中&#xff0c;Facebook凭借其巨大的用户基础和创新的技术应用&#xff0c;被公认为数字社交领域的领航者之一。本文将深入解析Facebook在数字社交中的引领作用&#xff0c;探…

这三款工具很好用,赶快试试

FileZilla FileZilla是一款免费开源的FTP软件&#xff0c;分为客户端版本和服务器版本&#xff0c;具备所有的FTP软件功能。它是一个快速、可信赖的FTP客户端以及服务器端开放源代码程序&#xff0c;具有多种特色和直觉的界面。FileZilla客户端版是一个方便高效的FTP客户端工具…

第一后裔The First Descendant开服时间、配置要求一览

第一后裔是一款采用虚幻5引擎打造的第三人称合作射击动作RPG&#xff0c;玩家将化身为一名继承者&#xff0c;通过各种任务和故事不断成长&#xff0c;为守护人类与对抗侵略者战斗。该作即将上线&#xff0c;为了不让玩家们错过这款精彩的游戏&#xff0c;本文整理了第一后裔上…

测评:【AI办公】版本更迭与AI加持下的最新ONLYOFFICE桌面编辑器8.1

你是否还在为没有一款合适的在线桌面编辑器而苦恼&#xff1f;你是否还在因为办公软件的选择过少而只能使用WPS或者office&#xff1f;随着办公需求的不断变化和发展&#xff0c;办公软件也在不断更新和改进。ONLYOFFICE 作为一款全功能办公软件&#xff0c;一直致力于为用户提…

2024年全国青少年信息素养大赛图形化编程复赛样题_6547网

第 1 题 问答题 【编程实现】 按空格键随机切换背景&#xff0c;让背景对应的角色造型显示在舞台上。 【具体要求】 对角色编程&#xff0c;当按下空格键时&#xff0c;背景随机切换&#xff1b; 角色切换成对应的造型显示在舞台上&#xff1b; 角色说“我是”和它的造…

帮助你简易起步一个BLOG(博客搭建)项目

Blog项目 后端项目结构1. 项目初始化2. 详细步骤3.postman测试 前端1. 项目初始化2. 详细步骤 本章节是为了帮助你起步一个完整的前后端分离项目。 前端技术栈&#xff1a; react、vite、mantine、tailwind CSS、zustand、rxjs、threejs 后端技术栈&#xff1a;nodemon、nodej…

Transformer教程之神经网络和深度学习基础

在当今的人工智能领域&#xff0c;Transformer已经成为了一个热门的词汇。它不仅在自然语言处理&#xff08;NLP&#xff09;领域取得了巨大的成功&#xff0c;还在计算机视觉等其他领域展现出了强大的潜力。然而&#xff0c;要真正理解Transformer&#xff0c;我们首先需要扎实…

gdb用法

创建文件 // main.cpp文件 // 稳态误差 void pid_test_wentaiwucha() {float p 1.5;int t 1; // t 1s;int target 5; // 5m/sfloat output 0;float radis 3; // 稳态误差std::cout << "output: " << std::endl;fo…

并发 多线程

目录 thread thread 类总览 构造函数 join joinable ​编辑 detach swap yield swap 成员函数的调用 namespace::this_thread 线程同步--锁 互斥锁mutex 递归锁recursive_mutex 定时锁 Lock 锁辅助类 lock_guard​编辑 unique_lock std::lock 解决死锁问题 消息…

浅谈逻辑控制器之随机顺序控制器

浅谈逻辑控制器之随机顺序控制器 随机顺序控制器&#xff08;Random Order Controller&#xff09;作为一个独特的逻辑控制器&#xff0c;为测试脚本的执行增添了一层随机性&#xff0c;特别适用于模拟用户行为中不确定的访问模式。 随机顺序控制器概述 随机顺序控制器&…

代码随想录算法训练营第三十六天|62.不同路径、 63. 不同路径 II、343.整数拆分(可跳过)、96.不同的二叉搜索树(可跳过)

62.不同路径 题目链接&#xff1a;62.不同路径 文档讲解&#xff1a;代码随想录 状态&#xff1a;还行 思路&#xff1a;当前状态的只有可能是从上面或者左边过来的&#xff0c;所以 dp[i][j] dp[i-1] dp[j-1] 题解&#xff1a; public int uniquePaths(int m, int n) {if (…

Docker 安装Nginx部署网站 防火墙端口 数据卷挂载

拉取镜像 docker pull nginx#不写版本号 表示最新版本查看是否拉取成功 docker images#成功 nginx latest 605c77e624dd 2 years ago 141MB mysql 8.0 3218b38490ce 2 years ago 516MB mysql latest 3218b38490ce 2 years ago 5…

virtualbox(7.0) ubuntu(22) 和win11共享文件夹

在虚拟机中安装增强功能。在virtualbox中配置 执行命令将用户加入vboxsf组 sudo adduser your_usrname vboxsf 重启ubuntu即可

LeetCode 585, 438, 98

目录 585. 2016年的投资题目链接表要求知识点思路代码 438. 找到字符串中所有字母异位词题目链接标签思路代码 98. 验证二叉搜索树题目链接标签合法区间思路代码 中序遍历思路代码 585. 2016年的投资 题目链接 585. 2016年的投资 表 表Insurance的字段为pid、tiv_2015、tiv…

Charles网络抓包工具手机抓包配置(二)

目录 事前配置 配置手机连接 代理设置 Https请求设置 手机安装根证书 手机连接代理 证书获取​编辑 证书安装 成果 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们…

CesiumJS【Basic】- #020 加载glb/gltf文件(Primitive方式)

文章目录 加载glb/gltf文件(Primitive方式)1 目标2 代码实现3 资源文件加载glb/gltf文件(Primitive方式) 1 目标 使用Primitive方式加载glb/gltf文件 2 代码实现 import * as Cesium from "cesium";const viewer = new Cesium.Viewer

ElementPlus Combogrid 组件

效果图: 1.声明 Props类型 export type comboGridPropType { modelValue: any; url: string; keyField?: string; labelField?: string; filterOptions?: Array<ISearchOption>; tableColumns?: Array<TableColumns>; enableField?: string; multiple?: …

Psychtoolbox 脑电实验范式之mp4视频绘制

1. 读取 首先需要使用到Screen(‘OpenMovie’)函数&#xff0c;该函数可以读取mp4、gif格式的数据&#xff0c;具体方式如下&#xff1a; clear; clc; Screen(Preference, SkipSyncTests, 1); screens Screen(Screens); screenNum max(screens); [window, screenRect] Scr…

C++语法20 一维数组及其相关问题详解

这是《C算法宝典》语法入门篇的第20节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#xff1a;C语法入门&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&…