我对二分查找的理解是check作为两个部分的分界线,最终L停留在分界线左侧,R停留在分界线右侧。再根据题目取需要的L/R即可。

P1102 A-B 数对

题目背景

出题是一件痛苦的事情!

相同的题目看多了也会有审美疲劳,于是我舍弃了大家所熟悉的 A+B Problem,改用 A-B 了哈哈!

题目描述

给出一串正整数数列以及一个正整数 CC,要求计算出所有满足 A - B = CA−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。

输入格式

输入共两行。

第一行,两个正整数 N,CN,C。

第二行,NN 个正整数,作为要求处理的那串数。

输出格式

一行,表示该串正整数中包含的满足 A - B = CA−B=C 的数对的个数。
#include <bits/stdc++.h>
using namespace std;
int P[1008611],N,C,flag1,B,L,R,mid,num,flag2;
long long h;
int main()
{
    cin>>N>>C;
    for(int i=1;i<=N;i++)cin>>P[i];
    sort(P+1,P+N+1);
    for(int i=1;i<=N;i++)
    {
        L=lower_bound(P+1,P+N+1,P[i]+C)-&P[1];//把所有元素看作A,在数组中寻找B的首位置
        R=upper_bound(P+1,P+N+1,P[i]+C)-&P[1];//寻找B的末位置
        h+=R-L;//
    }
    cout<<h;
}

P1873 [COCI 2011/2012 #5] EKO / 砍树

题目描述

伐木工人 Mirko 需要砍 MM 米长的木材。对 Mirko 来说这是很简单的工作,因为他有一个漂亮的新伐木机,可以如野火一般砍伐森林。不过,Mirko 只被允许砍伐一排树。

Mirko 的伐木机工作流程如下:Mirko 设置一个高度参数 HH(米),伐木机升起一个巨大的锯片到高度 HH,并锯掉所有树比 HH 高的部分(当然,树木不高于 HH 米的部分保持不变)。Mirko 就得到树木被锯下的部分。例如,如果一排树的高度分别为 20,15,1020,15,10 和 1717,Mirko 把锯片升到 1515 米的高度,切割后树木剩下的高度将是 15,15,1015,15,10 和 1515,而 Mirko 将从第 11 棵树得到 55 米,从第 44 棵树得到 22 米,共得到 77 米木材。

Mirko 非常关注生态保护,所以他不会砍掉过多的木材。这也是他尽可能高地设定伐木机锯片的原因。请帮助 Mirko 找到伐木机锯片的最大的整数高度 HH,使得他能得到的木材至少为 MM 米。换句话说,如果再升高 11 米,他将得不到 MM 米木材。

输入格式

第 11 行 22 个整数 NN 和 MM,NN 表示树木的数量,MM 表示需要的木材总长度。

第 22 行 NN 个整数表示每棵树的高度。

输出格式

11 个整数,表示锯片的最高高度。

#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
long long P[1008611],N,C,flag1,B,L,R,mid,num,flag2;
long long l,r;//int小了不能ac
int check(int n)
{
    num=0;
    for(long long i=1;i<=N;i++)
    {
        if(P[i]<=n)num+=0;
        else num+=P[i]-n;
    }
    if(num>=L)return 1;
    else return 0;
}
int main()
{
    cin>>N>>L;
    for(long long i=1;i<=N;i++)cin>>P[i];
    sort(P+1,P+N+1);
    l=0,r=P[N]+1;//边界(0,P[N]+1)
    while(l+1!=r)//答案二分
    {
        mid=(l+r)>>1;
        if(check(mid))l=mid;//[1,L]满足木材数量>=M米,则R正好是使得木材数<M米的第一个数
        else r=mid;
    }
    cout<<l;
   
}

P1824 进击的奶牛

题目描述

Farmer John 建造了一个有 NN(22 \le≤ NN \le≤ 100000100000) 个隔间的牛棚,这些隔间分布在一条直线上,坐标是 x_1x1​ ,...,x_NxN​ (0 \le≤ x_ixi​ \le≤ 10000000001000000000)。

他的 CC(22 \le≤ CC \le≤ NN) 头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John 想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

输入格式

第 11 行:两个用空格隔开的数字 NN 和 CC。

第 22 ~ N+1N+1 行:每行一个整数,表示每个隔间的坐标。

输出格式

输出只有一行,即相邻两头牛最大的最近距离。

#include <bits/stdc++.h>
using namespace std;
int A[1008611],B[1008611],l,r,mid,L,R,MID,n,m;
int check(int N)
{
    int num=1;
    for(int i=1;i<=n;i++)//二分查找下一个符合条件的牛棚
    {
        L=i-1,R=n+1;
        while(L+1!=R)
        {
            MID=(L+R)/2;
            if(A[MID]-A[i]>=N)L=MID;
            else R=MID;
        }
        if(A[L]-A[i]>=N)num++;
        i=L-1;//for循环结束后i++l,故-1为敬(这个bug我修了半个小时)
    }
    //cout<<num<<endl;
    if(num>=m)return 1;
    else return 0;
}
int main() 
{
   cin>>n>>m;
   for(int i=1;i<=n;i++)cin>>A[i];
   sort(A+1,A+n);
   l=0,r=A[n]-A[1]+1;
   while(l+1!=r)//答案二分
   {
       mid=(l+r)/2;
       //cout<<"mid="<<mid<<endl;
       if(check(mid))l=mid;
       else r=mid;
       //cout<<"l="<<l<<"   "<<"r="<<r<<endl;
   }
    if(check(r))cout<<r;
    else cout<<l;
       //cout<<"l="<<l<<"   "<<"r="<<r<<endl;
}

P2249 【深基13.例1】查找

题目描述

输入 nn 个不超过 10^9109 的单调不减的(就是后面的数字不小于前面的数字)非负整数 a_1,a_2,\dots,a_{n}a1​,a2​,…,an​,然后进行 mm 次询问。对于每次询问,给出一个整数 qq,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出 -1−1 。

输入格式

第一行 22 个整数 nn 和 mm,表示数字个数和询问次数。

第二行 nn 个整数,表示这些待查询的数字。

第三行 mm 个整数,表示询问这些数字的编号,从 11 开始编号。

输出格式

输出一行,mm 个整数,以空格隔开,表示答案。

#include <bits/stdc++.h>
using namespace std;
int A[1008611],B[1008611],l,r,mid;
int main() 
{
   int n,m;
   cin>>n>>m;
   for(int i=1;i<=n;i++)cin>>A[i];
   for(int i=1;i<=m;i++)cin>>B[i];
   sort(A+1,A+n+1);
   for(int i=1;i<=m;i++)
   {
       l=0,r=n+1;
       while(l+1!=r)
       {
           mid=(l+r)/2;
           if(A[mid]>=B[i])r=mid;
           else l=mid;
       }
       //cout<<"l="<<l<<"   "<<"r="<<r<<endl;
       if(A[r]!=B[i])cout<<"-1";
       else cout<<r;
       if(i!=m)cout<<" ";
   }
}

P2678 [NOIP2015 提高组] 跳石头

题目背景

一年一度的“跳石头”比赛又要开始了!

题目描述

这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石。组委会已经选择好了两块岩石作为比赛起点和终点。在起点和终点之间,有 NN 块岩石(不含起点和终点的岩石)。在比赛过程中,选手们将从起点出发,每一步跳向相邻的岩石,直至到达终点。

为了提高比赛难度,组委会计划移走一些岩石,使得选手们在比赛过程中的最短跳跃距离尽可能长。由于预算限制,组委会至多从起点和终点之间移走 MM 块岩石(不能移走起点和终点的岩石)。

输入格式

第一行包含三个整数 L,N,ML,N,M,分别表示起点到终点的距离,起点和终点之间的岩石数,以及组委会至多移走的岩石数。保证 L \geq 1L≥1 且 N \geq M \geq 0N≥M≥0。

接下来 NN 行,每行一个整数,第 ii 行的整数 D_i( 0 < D_i < L)Di​(0<Di​<L), 表示第 ii 块岩石与起点的距离。这些岩石按与起点距离从小到大的顺序给出,且不会有两个岩石出现在同一个位置。

输出格式

一个整数,即最短跳跃距离的最大值。

#include <bits/stdc++.h>
using namespace std;
int A[1008611],B[1008611],l,r,mid,L,R,MID,n,m,YICHU;
int check(int N)
{
    int num=0;
    L=0;
    for(int i=1;i<=m+1;i++)//挨个查找
    {
        if(A[i]-A[L]<N)num++;
        else L=i;
        /*如果相邻的石头间距小于N,num++,此时忽略第i块石头,即此时L仍然是i-1,转为计算i-1与i+1的间距*/
    }
    //cout<<"num="<<num<<"N="<<N<<endl;
    if(num>YICHU)return 0;//如果移除的石头数量num大于题目所给的最大移除数量
    else return 1;
}
int main() 
{
   cin>>n>>m>>YICHU;
   if(m==0&&m<=YICHU)
   {
       cout<<n;
       return 0;
   }
   for(int i=1;i<=m;i++)cin>>A[i];
   A[m+1]=n;
   sort(A+1,A+m+1);
   l=0,r=n+1;
   while(l+1!=r)//答案二分
   {
       mid=(l+r)/2;
      // cout<<"mid="<<mid<<endl;
       if(check(mid))l=mid;//相当于check是一条线,线左侧是l,右侧是r
       else r=mid;
       //cout<<"l="<<l<<"   "<<"r="<<r<<endl;
   }
    if(check(r))cout<<r;
    else cout<<l;
       //cout<<"l="<<l<<"   "<<"r="<<r<<endl;
}

第二周周报:预备队训练-week2(二分查找)相关推荐

  1. Java学习---第二周周报

    第二周周报 收获 关于第一周知识的查漏补缺 JDK,JRE,JVM 分别是什么,彼此之间的关系是怎么样的? JDK为Java语言的软件开发工具包,是整个Java的核心:包含JRE和JVM JVM是Ja ...

  2. 第1天-代码随想录刷题训练| 704二分查找、26移除元素

    文章目录 1. 二分查找704 扩展 2.移除元素 2.1数组理论基础 2.2 暴力解法 2.3双指针解法 2.4 扩展题 1. 二分查找704 原题链接 给定一个 n 个元素有序的(升序)整型数组 ...

  3. 团队大作业第二周周报

    团队大任务第二周总结 本周小组分工 咖啡机的物理建模 我,赵宏伟 基于Stateflow设计各个软件模块的控制逻辑和算法 赵言明,吴彦均,方葵 本人完成工作 这周因为我另外参加的UROP项目面临结项答 ...

  4. 第二周周报(9.13-9.19)

    目录 一 .本周任务 二.已完成的任务 1.横向课题 2.上线代码与论文 2.1 代码 2.2 论文 2.3 修改论文 2.4 论文与代码理解 3.跟踪张钹团队成果 4.大概了解人工智能安全方向 4. ...

  5. 货款违约预测第二周周报

    数据分析 上次主要查看了数据的类型以及是否缺失,这次数据分析首先查看各个特征的基本统计量: 知道了各个特征的一些基本统计量之后,先查找出数据中的对象特征和数值特征,再查看缺失数据的多少: 然后用一般的 ...

  6. (前端学习)寒假第二周周报

    本周对css进一步的学习: 附带学习视频的进度 学习了: css的三大特性 特性 作用 继承性 给父元素设置一些属性,子元素也可以使用(只有以color,font-,text-,line开头的可以继承 ...

  7. NEFU 大一寒假训练六(二分查找)题目预测

    说明 预测原理还是基于这篇文章:NEFU OJ 比赛试题预测 (Python) 为防止格式更正导致文章进入待审核状态,所以今天晚上就不修正格式了 如果有格式问题请自行理解,问题产生主要与Markdow ...

  8. XUPT_ACM2021寒假训练第二周练习记录

    试题链接:第二周训练题 - Virtual Judge 这周事情比较多,没有把20道题全部写完,只写了14道题. 目录 B - 补提交卡 C - 热血格斗场 D - 背包包 E - 数列极差 G - ...

  9. (王道408考研数据结构)第七章查找-第二节2:二分查找及其判定树

    文章目录 一:二分查找法基本思想 二:二分查找法代码 三:二分查找法效率分析 三:二分查找判定树的构造 (1)规律 (2)构造 (3)特点 (4)时间复杂度 一:二分查找法基本思想 二分查找法(Bin ...

  10. DICTATOR第一周二分查找作业

    [有序数组]二分查找(C语言实现) 本文章仅供提交作业与课内交流使用,并无参考借鉴价值 //Author DICTATOR //这是对有序数组进行二分查找的代码#include<stdlib.h ...

最新文章

  1. Git commit message和工作流规范
  2. 【数字智能三篇】之一: 一页纸说清楚“什么是大数据”
  3. 长春理工大学第十四届程序设计竞赛
  4. 【渝粤教育】国家开放大学2018年秋季 1021t劳动与社会保障法 参考试题
  5. 产品经理,如何降噪学习?
  6. 终端传感了解吗?18个知识点为你扫盲
  7. 牛逼!终于有人开源了一份基于SSM框架实现了支付宝支付功能的完整源代码......
  8. manjaroLinux下安装mysql时初始化mysql出错解决办法
  9. 【JavaScript脚本编程技术详解-----(一)】
  10. mysql性能优化总结详解:MySQL数据库从原理到高性能实战
  11. 【数据结构】约瑟夫问题
  12. android 字体倒影,Android实现图片的倒影效果
  13. 阿里云天池机器学习task3
  14. Windows10 桌面不停的闪烁问题
  15. 运用电脑辅助 对彩票号码 进行 数字分析 — 华东15选5
  16. python32位与62位可以随便装吗_电脑32位和64位可以随便换吗???
  17. 快速理解数据库超键,候选键,主键
  18. VS2005中文版下载地址和msdn_vs2005中文版
  19. 进程的通信 - 剪切板
  20. 基于轮廓发现的几何形状识别

热门文章

  1. 模拟小白:挑战23天JAVA程序设计从入门到精通第一天
  2. 自行车码表CPU选型
  3. mysql 库存超卖_mysql处理高并发,防止库存超卖
  4. 购物网站(测试+步骤+代码)
  5. AERONET数据产品介绍
  6. 面试被问Redis锁的缺点,被打击的扎心了
  7. dojo调用php,Dojo入门篇
  8. 海量数据荣获华为“中国政企数据存储优秀合作伙伴”金奖
  9. AutoIt-v3的安装,和robotframework-autoitlibrary的导入
  10. 《诗经·王风·黍离》