首页 > 编程语言 >算法学习-二分查找

算法学习-二分查找

时间:2023-05-28 22:48:08浏览次数:50  
标签:二分 直线 int bound 斜率 算法 查找 抛物线

题目:C. Place for a Selfie Codeforces Round 862(Div.2)

题目链接:Problem - C - Codeforces

题目描述:

   有若干抛物线(抛物线方程为a * x2 + b * x + c,每条抛物线的a,b,c值给出)和经过原点,斜率不同的直线(斜率值k给出)。对于每条抛物线找出任意一条直线,它与该抛物线不相交。 题目分析:

  直线与抛物线不相交,有公式(b - k)2 - 4  * a * c < 0,所以我们需要找这样一条直线,它的斜率k最接近b值(贪心思想:使公式左边尽可能小)。使用数组将所有直线斜率值存储起来并排序,使用二分查找出最接近b的那个斜率值。

  注意点:在我们找到的斜率右边可能存在一个斜率,使得上述公式左边更小。

 

知识点补充:二分搜索:

lower_bound(begin, end, target)函数:在数组中查询大于等于的目标的第一个下标

    int arr[5]{1, 3, 3, 5, 9};
    cout << lower_bound(arr, arr + 5, 3) - arr << endl; //输出值为1,解释:在数组中找到了第一个3,其下标为1
    cout << lower_bound(arr, arr + 5, 4) - arr << endl; //输出值为3,解释:在数组中,4排在3之后,因此结果被记为3
    cout << lower_bound(arr, arr + 5, 100) - arr << endl; //输出值为5,解释:在数组中,100排在9之后,因此结果被记为5
    cout << lower_bound(arr, arr + 5, -1) - arr << endl; //输出值为0,解释:在数组中,-1排在1之前,因此结果被记为0

upper_bound(begin, end, target)函数:在数组中查询大于目标的第一个下标

    int arr[4]{1, 3, 3,5, 9};
    cout << upper_bound(arr, arr + 5, 3) - arr << endl; //输出值3,5是第一个大于3的值其下标为3
    cout << upper_bound(arr, arr + 5, 4) - arr << endl; //输出值3
    cout << upper_bound(arr, arr + 5, 100) - arr << endl; //输出值5
    cout << upper_bound(arr, arr + 5, -1) - arr << endl; //输出值0

二分查找的底层逻辑思考:

int lower_bound(vector<int>& nums, int target) {
    int left = 0;
    int right = nums.size() - 1;

    while (left <= right) {
        int mid = left +(right - left) / 2;
        if (nums[mid] < target) { 
        // 中点值小于target,则移动右指针置为中点下标+1,不断进行二分,直到中点值能够大于等于target。
     // 对于upper_bound()来说,这里判断条件是num[mid] <= target,如果中点值小于等于target,则二分到中点值大于target。 left = mid + 1; } else { right = mid - 1; } } return left; }

 

 

标签:二分,直线,int,bound,斜率,算法,查找,抛物线
From: https://www.cnblogs.com/yang-ever/p/17438756.html

相关文章

  • 期望最大化EM算法(2)
    一般形式的EM算法  期望最大化算法或者EM算法是,求解具有潜在变量的概率模型的最大似然解的一种通用方法。这里给出一般形式的EM算法,并启发式地推导EM算法最大化了似然函数。  考虑一个概率模型,将其中所有的观测变量联合起来记为\(X\),将所有的与观测变量对应的潜在变量记为......
  • 文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题
    六、用Strassen算法作为子进程来进行一个knn矩阵和一个nkn矩阵相乘,最快需要花费多长时间?对两个输入矩阵规模互换的情况,回答相同的问题。文心一言:Strassen算法是一种用于矩阵乘法的分治算法,它将原始的矩阵分解为较小的子矩阵,然后使用子矩阵相乘的结果来计算原始矩阵的乘积......
  • 文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题
    六、用Strassen算法作为子进程来进行一个knn矩阵和一个nkn矩阵相乘,最快需要花费多长时间?对两个输入矩阵规模互换的情况,回答相同的问题。文心一言:Strassen算法是一种用于矩阵乘法的分治算法,它将原始的矩阵分解为较小的子矩阵,然后使用子矩阵相乘的结果来计算原始矩阵的乘积。对......
  • 算法刷题记录:乒乓球
    题目链接https://ac.nowcoder.com/acm/contest/19306/1033题目分析这题好坑,乒乓球的比分如果相差<2,还得继续比下去,但是题目里面没有说qwq。看了眼题解才发现这个点。AC代码#include<iostream>usingnamespacestd;//统计11分制和21分制的比分strings;intmain(......
  • 数论-裴蜀定理-扩展欧几里得算法
    裴蜀定理对于任意的整数a、b,都存在一对整数x、y(注意x和y可以是负整数),使得\(ax+by=gcd(a,b)\)成立。或者可以这样描述:对方程\(ax+by=c,(a,b,c∈Z)\),只有满足\(gcd(a,b)|c\)(即a和b的最大公约数可以整除c),方程才有整数解。扩展欧几里得算法的证明已知\(gcd(a,b)=gcd(b,a\%b)\)......
  • 电赛控制类PID算法实现
    一、什么是PID学过自动控制原理的对PID并不陌生,PID控制是对偏差信号e(t)进行比例、积分和微分运算变换后形成的一种控制规律。PID算法的一般形式:PID控制系统原理框图二、PID离散化对PID连续系统离散化,从而方便在处理器上实现,PID离散表示形式:离散化后最终得到位置式PI......
  • 《数据结构与算法》之栈结构
    导言:在计算机发明之初是为了计算,所以叫计算机,对我们给定的一个算式,然后给定的一套规则加,减,乘,除,等,它就可以自己进行计算了,然后返回一个结果给我们对于一般的算式:2+3+4很显然,从左往右依次扫描,依次相加很简单的计算出来,因为它们是同级运算,可以很简单的做到但是,常见的运算不只......
  • 数据结构与算法脉络总结
    目录一、数据结构1.链表2.栈3.队列4.散列表5.集合6.字典树7.堆8.优先队列9.并查集二、算法1.排序2.字符串3.图论4.贪心5.动态规划6.其他:分治、二分查找、双指针、多路归并一、数据结构1.链表2.栈3.队列4.散列表5.集合6.字典树7.堆8.优先队列9.......
  • FIT3155 S1 加解密算法
    FIT3155S1/2023:Assignment3(Duemidnight11:55pmonSunday28May2023)[Weight:10=5+5marks.]Yourassignmentwillbemarkedontheperformance/efficiencyofyourprograms.Youmustwriteallthecodeyourself,andshouldnotuseanyexternallibrary......
  • 算法学习day28回溯part04-93、78、90
    packageLeetCode.backtrackpart04;importjava.util.ArrayList;importjava.util.List;/***93.复原IP地址*有效IP地址正好由四个整数(每个整数位于0到255之间组成,且不能含有前导0),整数之间用'.'分隔。*例如:"0.1.2.201"和"192.168.1.1"是有效IP地......