首页 > 其他分享 >二分查找与二分答案题解

二分查找与二分答案题解

时间:2022-11-09 18:00:31浏览次数:58  
标签:二分 存储 int 题解 mid else 查找 答案

此类题目的特征为数据量大,数据为升序或降序

根本目的是 通过二分法快速缩小答案范围,然后对比数据或验证答案

2.1二分查找

输出时注意mid是否为第一个出现的答案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int a[1000000];
 4 int main(void)
 5 {
 6     int n,m,l,r,mid,serch;
 7     //输入 
 8     cin>>n>>m;
 9     for(int i=0;i<n;i++)
10     {
11         cin>>a[i];
12     }
13     //左l,右r 二分查找
14     for(int i=0;i<m;i++)
15     {
16         l=0,r=n-1;
17         cin>>serch;
18         while(l<=r)
19         {
20             mid=(l+r)/2;
21             if(a[mid]==serch)
22             {
23                 if(a[mid-1]==a[mid]&&mid!=0)
24                 {
25                     r=mid-1;
26                     continue;
27                 }
28                 cout<<mid+1<<" ";
29                 break;
30             }
31             else if(a[mid]>serch)r=mid-1;
32             else l=mid+1;
33         }
34         if(l>r)cout<<"-1 ";
35     }
36     return 0;
37 }

2.2二分答案

 

mid存储被测试的答案,用all存储该答案能存下的牛总数

#include<bits/stdc++.h>
using namespace std;
int a[100000];
int main(void)
{
    int n,c,l=1,r,mid,all;
    cin>>n>>c;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    r=a[n-1]/c;
    while(l<=r)
    {
        all=1;
        mid=(l+r)/2;
        for(int i=1,j=0;i<n;i++)
        {
            if(a[i]-a[j]>mid)
            {
                all++;
                j=i;
            }
        }
        if(all>=c)l=mid+1;
        else r=mid-1;
    }
    cout<<l;
    return 0;
}

2.3二分答案

 

同样用mid存储被测试的答案,用b存储目前所在位置,用all存储移走的石头数

#include<bits/stdc++.h>
using namespace std;
int a[50001]={0};
int main(){
    int l,n,m,mid,left=1,right,all,b;
    cin>>l>>n>>m;
    right=l;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    a[n+1]=l;
    while(left<right-1)
    {
        mid=(right+left)/2;
        b=0;
        all=0;
        for(int i=1;i<=n+1;i++)
        {
            if(a[i]-b>=mid)b=a[i];
            else all++;
        }
        if(all>m)right=mid;
        else left=mid;
    }
    if(n==0)cout<<l;
    else cout<<left;
    return 0;
}

 

标签:二分,存储,int,题解,mid,else,查找,答案
From: https://www.cnblogs.com/if-I-can-fly/p/16874697.html

相关文章

  • CF1285D Dr. Evil Underscores 题解
    给定一个序列\(a\),选取一个\(x\),使\(\max_{i=1}^na_i\oplusx\)最小。看到这种题直接按位考虑,如果最高位全是\(1\)那把\(x\)的这位全变成\(1\),如果最高位全是\(......
  • C语言二分查找
    #include<stdio.h>intbinary_search(intarr[],intk,intsz){intleft=0;intright=sz-1;while(left<=right){intmid=(left+right)/2;if(arr[mid]<k){ left=mi......
  • 洛谷P1605题解分析
    迷宫题目描述给定一个\(N\timesM\)方格的迷宫,迷宫里有\(T\)处障碍,障碍处不可通过。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障......
  • 算法之二分法(求根号一个数)
    1.二分法:指的是在一个区间内无限迫近一个数。2.代码解释:如果说需要排除01两个特殊值,那么需要把左指针的值变为1。左右指针是指向某一个数,而不是固定的,注意在i......
  • CF1747 题解
    比赛链接:https://codeforces.com/contest/1747题解:AB水题//bySkyRainWind#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include......
  • P1688 新单词接龙问题 题解
    大家好,我喜欢Hash,所以我用Hash通过了这道题。思路:处理方法有点类似于P6521首先我们最终接出的字符串要求其中的小字符串按字典序排序,那么我们就将所有字符串排好序......
  • 问题解决-白鹭引擎Egret Wing3修改项目内容后进行调试,项目仍显示修改前样式
    问题描述:修改前: 修改后: 解决方法:点击上方菜单栏项目-清理,进行项目清理    点击菜单栏项目-调试  重新进行调试。  调试成功后,问题成功解......
  • Vue学习记录--实现列表的添加删除以及查找功能
    1.x版本中的filterBy指令,在2.x中已经被废除:​​filterBy-指令​​<trv-for="iteminlist|filterBysearchNamein'name'"><td>{{item.id}}</td><td>{{item.name......
  • 问题解决-白鹭引擎Egret Wing3调试出错,输出台显示乱码而且编译终止问题Failed to load
    问题描述:Failedtoloadresource:theserverrespondedwithastatusof404()未能加载资源:服务器响应,状态为404() 解决方法:卸载引擎并重新安装,安装时使用默认路径(C......
  • 使用Javascript查找图像上的坐标
    下面的代码在页面标题中。GetCoordinates函数使用window.event方法查找单击鼠标时的坐标。它还需要考虑任何滚动和图像在文档中的位置,以便坐标始终相对于图像的左上角。......