zoukankan      html  css  js  c++  java
  • [swustoj 1092] 二分查找的最大次数

    二分查找的最大次数(1092)

    问题描述

    这里是一个在排序好的数组A(从小到大)中查找整数X的函数,返回值是查找次数。

    int binarySearch(inta[],int n,int x)//数组,数组大小,查找的数据
    {
          int cnt=0;
          int L=0,R=n-1,mid;
          while(true)
          {
                cnt++;
                mid=(L+R)/2;
                if(a[mid]==x) returncnt;
                elseif(x<a[mid])R=mid;
                else L=mid+1;
          }
        return -1;
    }

    现在的问题是,数组a中某些数据损坏了,我们只知道数组中的一部分数据和数组的大小N,我们想知道查找整数X最大的可能的查找次数,我们假设数组中每个数都不相同,且X一定出现在原数组中,a在被损坏前的是已经排好序的。

    输入

    多组测试数据,每组第一行是数组大小N(1<=N<=100000),第二行是这个数组的数,这个数组都是正数,-1表示这个数据被损坏。第三行是查找的正整数X。数据都在32位以内。

    输出

    X的最大查找次数。

    样例输入

    5
    1 2 3 4 5
    3
    5
    1 -1 -1 -1 5
    3
    5
    -1 -1 -1 -1 -1
    3

    样例输出

    1
    2
    3

    好像没什么说的

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    using namespace std;
    #define INF 0x3f3f3f3f
    #define N 100010
    
    int n,k;
    int a[N];
    int ans[N];
    
    int bs(int k)
    {
        int cnt=0;
        int l=0,r=n-1;
        while(l<=r)
        {
            cnt++;
            int m=(l+r)>>1;
            if(a[m]==k) return cnt;
            else if(k<a[m]) r=m;
            else l=m+1;
        }
    }
    int init()
    {
        for(int i=0;i<n;i++) a[i]=i;
        for(int i=0;i<n;i++) ans[i]=bs(a[i]);
    }
    int main()
    {
        while(scanf("%d",&n)!=EOF)
        {
            init();
            for(int i=0;i<n;i++) scanf("%d",&a[i]);
            scanf("%d",&k);
    
            //确定k的范围
            int L=0,R=n-1;
            for(int i=0;i<n;i++)
            {
                if(a[i]==-1) continue;
                if(a[i]<k) L=i+1;
                else if(a[i]==k)
                {L=R=i;break;}
                else if(a[i]>k)
                {R=i-1;break;}
            }
            int ret=0;
            for(int i=L;i<=R;i++)
            {
                ret=max(ret,ans[i]);
            }
            cout<<ret<<"
    ";
        }
        return 0;
    }
    趁着还有梦想、将AC进行到底~~~by 452181625
  • 相关阅读:
    Google Chrome中的高性能网络 (三)
    Linux入门基础 #5:Linux文件系统挂载管理
    git学习 #2:git基本操作
    ural 1018 Binary Apple Tree(树形dp | 经典)
    MST最小生成树及Prim普鲁姆算法
    UVA 10465 Homer Simpson(dp + 完全背包)
    Android 微信SDK分享功能中的最全过程步骤分析
    python第三方库推荐
    C. Tourist Problem
    Shell脚本编程——了解你的Linux系统必须掌握的20个命令
  • 原文地址:https://www.cnblogs.com/hate13/p/4489550.html
Copyright © 2011-2022 走看看