首页 > 其他分享 >二分答案法

二分答案法

时间:2024-12-28 14:41:12浏览次数:6  
标签:二分 arr nums int energy height vector 答案

[Algo] 二分答案法

1. 机器人跳跃

// 1. 机器人跳跃
// https://www.nowcoder.com/practice/7037a3d57bbd4336856b8e16a9cafd71
bool complete(int energy, vector<int>& height, int max) {
    for (int i = 1; i < height.size(); i++) {
        if (height[i] > energy) energy -= height[i] - energy;
        else energy += energy - height[i];
        if (energy >= max) return true;
        if (energy < 0) return false;
    }
    return true;
}
int minEnergy(vector<int>& height) {
    int maxHeight = 0;
    for (int h : height) maxHeight = maxHeight >= h ? maxHeight : h;
    int l = 0, r = maxHeight, m, ans;
    while (l <= r) {
        m = (l + r) / 2;
        if (complete(m, height, maxHeight)) {
            ans = m;
            r = m - 1;
        } else l = m + 1;
    }
    return ans;
}

2. 找出第K小的数对距离

// 2. 找出第K小的数对距离
// https://leetcode.cn/problems/find-k-th-smallest-pair-distance/
int distanceNoMoreThan(vector<int>& nums, int k)
{
    int sum = 0;
    for (int l = 0, r = 0; l < nums.size(); l++)
    {
        while (r + 1 < nums.size() && nums[r + 1] - nums[l] <= k) r++;
        sum += r - l;
    }
    return sum;
}
int smallestDistancePair(vector<int>& nums, int k) {
    sort(nums.begin(), nums.end());
    int len = nums.size();
    int l = 0, r = nums[len - 1] - nums[0], m, ans;
    while (l <= r)
    {
        m = (l + r) / 2;
        if (distanceNoMoreThan(nums, m) < k) l = m + 1;
        else { ans = m; r = m - 1; }
    }
    return ans;
}

3. 计算等位时间

// 3. 计算等位时间
// 给定一个数组arr长度为n,表示n个服务员,每服务一个人的时间
// 给定一个正数m,表示有m个人等位,如果你是刚来的人,请问你需要等多久?
// 假设m远远大于n,比如n <= 10^3, m <= 10^9, 且遵循有空直接上的原则
struct Compare {
    bool operator()(const pair<int, int>& a, const pair<int, int>& b) {
        return a.first > b.first; // pair.first 越小优先级越高
    }
};
int waitingTime1(vector<int> &arr, int m)
{
    priority_queue<pair<int, int>, vector<pair<int, int>>, Compare> heap; 
    // pair.first - 空闲时刻, pair.second - 工作效率
    for (int i = 0; i < arr.size(); i++) heap.push(make_pair(0, arr[i]));
    for (int i = 0; i < m; i++)
    {
        pair<int, int> cur = heap.top();
        heap.pop();
        cur.first += cur.second;
        heap.push(cur);
    }
    return heap.top().first;
}

int f(vector<int> &arr, int time)
{
    int ans = 0;
    for (int num : arr) ans += time / num + 1;
    return ans;
}
int waitingTime2(vector<int> &arr, int m)
{
    int min_val = INT32_MAX;
    for (int num : arr) min_val = min(min_val, num);
    int l = 0, r = m * min_val, mid, ans;
    while (l <= r)
    {
        mid = (l + r) / 2;
        if (f(arr, mid) < m + 1) l = mid + 1;
        // f - 给定时间内能服务的客人总数(包括开始)
        else { ans = mid; r = mid - 1; }
    }
    return ans;
}

标签:二分,arr,nums,int,energy,height,vector,答案
From: https://www.cnblogs.com/yaoguyuan/p/18637490

相关文章

  • xdoj-指针类别 题目及参考答案
    目录写在前面220题目参考答案231题目参考答案232题目参考答案233题目参考答案235题目参考答案236题目参考答案237题目参考答案470题目参考答案536题目参考答案561题目参考答案660题目参考答案661题目参考答案662题目参考答案663题......
  • 二分(离散化/哈希)
    题目:链接:https://ac.nowcoder.com/acm/problem/207053题意:简单来说就是每次猜值,根据反馈判断答案所在的区间,找区间重叠次数最多的那部分的重叠次数思路:若猜中,区间[num,num]次数+1若猜大了,区间[-inf,num-1]次数+1若猜小了,区间[num+1,inf]次数+1在[-inf,inf]上使用......
  • 【2024最新Java面试宝典】—— SpringBoot面试题(44道含答案)_java spingboot 面试题
    1.什么是SpringBoot?SpringBoot是Spring开源组织下的子项目,是Spring组件一站式解决方案,主要是简化了使用Spring的难度,简省了繁重的配置,提供了各种启动器,使开发者能快速上手。2.为什么要用SpringBoot快速开发,快速整合,配置简化、内嵌服务容器3.SpringBoot与Sp......
  • 实数二分
    当二分查找的区间是一个实数域时,称之为实数二分。实数二分的算法思想没有变化,但时因为实数和整数不同,整数是离散的,可以逐一枚举,区间中除了首尾边界外,每个整数都有一个前驱和后驱;实数是连续的,所以实现方式和整数二分有所不同。常见的形式是通过确定好精度prec(le-6,le-8等),以left+p......
  • Leetcode刷题第一天-二分查找
    https://leetcode.cn/problems/sqrtx/?envType=problem-list-v2&envId=binary-searchclassSolution:defmySqrt(self,x:int)->int:ifx<0:returnNone#左闭右闭区间[0,x]#求算数平方根,a*a=x,所以a<=x/2#判断x/2的平方和x的大小,......
  • 二分香农(范诺编码)——MATLAB实现
    本文通过MATLAB实现了二分香农(范诺编码),部分代码如下:clear;clc;%%图像读取处理pic=[1005656651282142220010010010065];hdz=[10056651282142135200];p=[0.380.200.140.110.080.040.030.02];num=length(pic);m=1;n=num;%%图像编码[p,c]=so......
  • Linux基础篇、学习习题测试_01答案
    Linux基础篇欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神!                                                                                 ————......
  • c语言实现重要算法二分查找和归并排序
    如有错误,请大佬指正,谢谢!前言二分查找和归并排序在c语言的算法学习中尤为重要,学会掌握这两种方法可以帮助我们解决数组排序和数组某元素查找的问题,尤其是在处理数据较多的时候。目录文章目录前言一、介绍一下二分查找和归并排序的概念和优点二、二分查找的实现三.归并......
  • Spring常见的77道面试题及答案
    一、Spring概述1.什么是spring?2.Spring框架的设计目标,设计理念,和核心是什么?3.Spring的优缺点是什么?4.Spring有哪些应用场景5.Spring由哪些模块组成?6.Spring框架中都用到了哪些设计模式?7.详细讲解一下核心容器(springcontext应用上下文)模块8.Spring框架中有......
  • 二分查找
    704.二分查找-力扣(LeetCode)34.在排序数组中查找元素的第一个和最后一个位置-力扣(LeetCode)35.搜索插入位置-力扣(LeetCode)69.x的平方根-力扣(LeetCode)二分查找是一种在有序数组中查找特定元素的搜索算法。它通过比较数组中间元素与目标值来工作,从而将搜索范围缩小到......