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

二分答案

时间:2023-06-13 15:33:52浏览次数:51  
标签:二分 right int price mid 答案 left

概述

二分答案即利用二分查找来得到答案,一般情况下,左边界 $left$ 是 $0$ 或者 $1$;右边界 $right$ 则视题目条件而定,取一个很大的数,然后利用二分查找的思想,来找到答案。

二分答案的要求

如果题目能够使用二分答案的思想来解决,那么 $[left, right]$ 范围内,要满足二段性,即对 $[left, res]$ 满足条件 $A$,而 $(res, right]$ 不满足条件 $A$,并且 res 的取值范围是连续的。

适用情况

如果题目要求满足 xxx 条件下的最大值或者最小值,就可以考虑二分答案,特别的,如果题目要求最小化的最大值或者最大化的最小值,那么要首先考虑使用二分答案。

例题

2517. 礼盒的最大甜蜜度 (Medium)

class Solution {
  public:
    int Bsearch(int target, vector<int> &price, int left) {
        int right = price.size();
        while (left < right) {
            int mid = left + (right - left) / 2;
            if (price[mid] < target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left;
    }
    bool Check(int mid, vector<int> &price, int k, int n) {
        int start = 0;
        for (int i = 0; i < k - 1; ++i) {
            start = Bsearch(price[start] + mid, price, start);
            // cout << start << " start\n";
            if (start >= n) { 
                return false;
            }
        }
        return true;
    }
    int maximumTastiness(vector<int> &price, int k) {
        // 先排序,然后考虑是二分答案还是双指针
        sort(price.begin(), price.end());
        // 二分答案,时间复杂度为 log(price[i]) * k * log(n)
        int n = price.size();
        int left = 0, right = (price[n - 1] - price[0]) / (k - 1) + 1; // 先看看 k 行不行,不行就改成 2
        while (left < right) {
            // 左闭右开
            int mid = left + (right - left) / 2;
            if (Check(mid, price, k, n)) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }
        return left - 1;
    }
};

标签:二分,right,int,price,mid,答案,left
From: https://www.cnblogs.com/zwyyy456/p/17477651.html

相关文章

  • ChatGPT之问艺道:如何借助神级算法Prompt,让你轻松get到更高质量答案?
    摘要:本文由葡萄城技术团队编写,文章的内容借鉴于IbrahimJohn的《TheArtofAskingChatGPT》(向ChatGPT提问的艺术)。前言当今,ChatGPT赢得越来越多人的青睐,人们通过它输入问题并获取答案。但除了简单的一问一答以外,ChatGPT还有许多隐藏的提问方式,是否想要一探究竟?今天,我们为您......
  • Looksery Cup 2015-H. Degenerate Matrix(浮点数二分)
    原题链接H.DegenerateMatrixtimelimitpertestmemorylimitpertestinputoutputdeterminant ofamatrix 2 × 2degeneratenorm ||A|| ofamatrix AYouaregivenamatrix .Consideranydegeneratemat......
  • HDU 3277 Marriage Match III(并查集+二分+最大流)
    题意:和HDU3081一样的题意,只不过多了一个条件,每个女孩除了能选自己喜欢的男生之外,还能选不超过K个自己不喜欢的男生,问游戏最多能进行几轮思路:除了选喜欢的,还能选任意K个不喜欢的,怎么建图呢?一开始我想每个女孩连喜欢的男孩,而且选K个不喜欢的男孩也连边,可是这K个要怎么确定呢?这种显然......
  • HDU 3081 Marriage Match II(二分+并查集+最大流)
    题意:有N个女孩要与N个男孩玩配对游戏.每个女孩有一个可选男孩的集合(即该女孩可以选自己集合中的任意一个男孩作为该轮的搭档).然后从第一轮开始,每个女孩都要和一个不同的男孩配对.如果第一轮N个女孩都配对成功,那么就开始第二轮配对,女孩依然从自己的备选男孩集合中选择,但是不能......
  • 4.4 分类算法-逻辑回归与二分类以及分类的评估方法
    1逻辑回归的简介1.1简介逻辑回归(LogisticRegression)是机器学习中的一种分类模型,逻辑回归是一种分类算法,虽然名字中带有回归,但是它与回归之间有一定的联系。由于算法的简单和高效,在实际中应用非常广泛。1.2应用场景广告点击率(是否会被点击)是否为垃圾邮件是否患病金融诈......
  • [c/c++/OC]高质量的面试题及答案及注解
    一、选择题C语言:1.声明语句为inta[3][4];下列表达式中与数组元素a[2][1]等价的是(A)。A、*(a[2]+1)B、a[9]C、*(a[1]+2)D、*(*(a+2))+1a[2]<==>*(a+2)是等价的C两个数反过来了,D、1放进去2.请问经过表达式a=5?0:1的运算,变量a的最终值是(C......
  • LeetCode----二分查找
    1算法原理适用条件:有序数组2算法模板classSolution:defsearch(self,nums:List[int],target:int)->int:left=0right=len(nums)-1#规则[left,right]whileleft<=right:#根据规则,举例[1,1]添加=是否合法即可......
  • 和与积 题解 简单二分查找
    题目大意:给定两个整数\(a(2\lea\le2\times10^9)\)和\(b(1\leb\le10^{18})\)。判断是否存在两个正整数\(x\)和\(y\),同时满足如下两个条件:\(x+y=a\)\(x\timesy=b\)解题思路:用\(a-x\)表示\(y\),可以得到面积的表达式为\(x\times(a-x)\),然后......
  • 查找一之顺序查找、二分查找、分块查找
    1、概念:在一些有序的或无序的数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程叫做查找,也就是给定一个值,在查找表中确定一个关键字等于给定值的记录或数据元素。2、平均查找长度(后期可能会增加)3、查找长度分为成功和失败两种4、顺序查找1、主要思想:将查找值......
  • LightOJ - 1048 Conquering Keokradong (二分)输出路径
    TimeLimit: 1000MSMemoryLimit: 32768KB64bitIOFormat: %lld&%lluLightOJ-1048ConqueringKeokradongSubmit StatusDescriptionThiswinterwearegoingonatriptoBandorban.ThemaintargetistoclimbuptothetopofKeokradong.So,wewilluse......