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

news2024/11/25 12:58:36

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

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

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

相关文章

HexPlane代码复现(十几分钟就复现成功的一篇论文代码!!!!!)

https://caoang327.github.io/HexPlane/ 一、 python setup.py develop命令用不了了 running develop /home/uriky/anaconda3/envs/hexplane/lib/python3.8/site-packages/setuptools/command/easy_install.py:144: EasyInstallDeprecationWarning: easy_install command is d…

仓库管理系统14--仓库设置

1、添加窗体 <UserControl x:Class"West.StoreMgr.View.StoreView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxmlformats.…

算法金 | 没有思考过 Embedding,不足以谈 AI

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 在当今的人工智能&#xff08;AI&#xff09;领域&#xff0c;Embedding 是一个不可或缺的概念。如果你没有…

背靠广汽、小马智行,如祺出行打得过滴滴和百度吗?

©自象限原创 作者丨艾AA 编辑丨薛黎 北京时间6月14日凌晨&#xff0c;在特斯拉股东大会上&#xff0c;马斯克阐述了对Robotaxi&#xff08;自动驾驶出租车&#xff09;商业模式的构想——特斯拉不仅会运营自己的无人驾驶出租车车队&#xff0c;还可以让特斯拉车主们的爱…

面试突击:Java 集合知识体系梳理

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。在 Java 开发中&#xff0c;集合类对象绝对是被使用最频繁的对象之一。因此&#xff0c;深入了解集合类对象的底层数…

Python操作MySQL数据库--使用pymysql模块

Python操作MySQL数据库--使用pymysql模块 一、新建数据库和数据表1.1 新建book数据库1.2 新建bookprice数据表二、连接数据库2.1 建立数据库连接三、新增数据3.1 新增单条数据3.2 新增多条数据3.3 批量新增四、修改数据4.1 修改单条数据4.2 修改多条数据五、删除数据5.1 删除单…

Linux系统相关函数总结

在应用程序当中&#xff0c;有时往往需要去获取到一些系统相关的信息&#xff0c;譬如时间、日期、以及其它一些系统相关信息&#xff0c;本章将向大家介绍如何通过 Linux 系统调用或 C 库函数获取这些系统信息。除此之外&#xff0c;还会向大家介绍 Linux 系统下的/proc 虚拟文…

springboot 缓存框架Cache整合redis组成二级缓存

springboot 缓存框架Cache整合redis组成二级缓存 项目性能优化的解决方案除开硬件外的方案无非就是优化sql&#xff0c;减少sql 的执行时间&#xff0c;合理运用缓存让同样的请求和数据库之间的连接尽量减少&#xff0c;内存的处理速度肯定比直接查询数据库来的要快一些。今天就…

代码随想录——跳跃游戏Ⅱ(Leetcode 45)

题目链接 贪心 class Solution {public int jump(int[] nums) {if(nums.length 1){return 0;}int count 0;// 当前覆盖最远距离下标int curDistance 0;// 下一步覆盖距离最远下标int nextDistance 0;for(int i 0; i < nums.length; i){nextDistance Math.max(nums[…

搭建 MySQL MHA

搭建 MySQL MHA 搭建 MySQL MHA实验拓扑图实验环境实验思路MHA架构故障模拟 实验部署数据库安装主从复制部署时间同步主服务器配置从服务器配置创建链接 MHA搭建安装依赖的环境安装 node 组件安装 manager 组件配置无密码认证在 manager 节点上配置 MHA管理 mysql 节点服务器创…

【Git】远程仓库

一、常用的托管服务[远程仓库] 二、注册码云 三、创建远程仓库 四、配置SSH公钥 五、操作远程仓库 5.1、添加远程仓库 5.2、查看远程仓库 5.3、推送到远程仓库 5.4、 本地分支与远程分支的关联关系 5.5、从远程仓库克隆 5.6、从远程仓库中抓取和拉取 5.7、解决合并冲突 一、常…

Python 算法交易实验73 QTV200第二步: 数据清洗并写入ClickHouse

说明 先检查一下昨天启动的worker是否正常工作&#xff0c;然后做一些简单的清洗&#xff0c;存入clickhouse。 内容 1 检查数据 from Basefuncs import * # 将一般字符串转为UCS 名称 def dt_str2ucs_blockname(some_dt_str):some_dt_str1 some_dt_str.replace(-,.).re…

简单粗暴-安装detectron2

文章目录 一、下载detectron2二、修改文件三、安装detectron2参考文献&#xff1a; 其他配置版本&#xff1a; torch1.12.1CUDA&#xff1a;11.6python&#xff1a;3.9 建议以上配置&#xff0c;其他配置未测试&#xff0c;如果CUDA版本不匹配的话&#xff0c;可以多配置不同版…

达梦数据库的系统视图v$locked_object

达梦数据库的系统视图v$locked_object 在达梦数据库&#xff08;Dameng Database&#xff09;中&#xff0c;V$LOCKED_OBJECT 视图提供了与数据库中被锁定对象相关的信息。这通常用于监控和诊断数据库中的锁定问题&#xff0c;帮助管理员了解哪些对象被锁定了&#xff0c;以及…

PyCharm2024 for mac Python编辑开发

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

自动建立用户练习

一丶编辑文本存放用户名 vim userlist 二丶编辑文本存放需要创建用户的密码 vim passlist 三丶编辑脚本 vim create_user.sh #!bin/bash [ "$#" -lt "2" ] && { #echo error please input userlist anpassli…

postgre事务id用完后,如何解决这个问题

在PG中事务年龄不能超过2^31 &#xff08;2的31次方2,147,483,648&#xff09;&#xff0c;如果超过了&#xff0c;这条数据就会丢失。 PG中不允许这种情况出现&#xff0c;当事务的年龄离2^31还有1千万的时候&#xff0c;数据库的日志中就会 有如下告警&#xff1a; warning:…

【第一周】认识小程序

目录 认识小程序发展历史发展前景发展优势个人企业/创业 账号申请开发工具下载流程使用说明 协作项目交流收益渠道 认识小程序 发展历史 微信小程序自2016年首次提出以来&#xff0c;经历了快速的发展和完善过程&#xff0c;以下是其主要发展历史节点&#xff1a; 2016年1月…

监控员工电脑的软件有哪些?6款企业必备的电脑监控软件

监控员工电脑的软件在企业管理和网络安全领域扮演着重要角色&#xff0c;它们可以帮助企业提高工作效率&#xff0c;确保数据安全&#xff0c;以及合规性。以下是六款知名的员工电脑监控软件&#xff1a; 1.安企神 - 一个全面的企业级电脑监控和管理解决方案。 2.Work Examine…

从单点到全景:视频汇聚/安防监控EasyCVR全景视频监控技术的演进之路

在当今日新月异的科技浪潮中&#xff0c;安防监控领域的技术发展日新月异&#xff0c;全景摄像机便是这一领域的杰出代表。它以其独特的360度无死角监控能力&#xff0c;为各行各业提供了前所未有的安全保障&#xff0c;成为现代安防体系中的重要组成部分。 一、全景摄像机的技…