UVa1554 - Binary Search

简介: UVa1554 - Binary Search

The program fragment below performs binary search of an integer number in an array that is sorted in a nondescending order:


Pascal (file "sproc.pas") C (file "sproc.c")


const

 MAXN = 10000;

var

 A: array[0..MAXN-1] of integer;

 N: integer;


procedure BinarySearch(x: integer);

var

 p, q, i, L: integer;

begin

 p := 0;   { Left border of the search  }

 q := N-1; { Right border of the search }

 L := 0;   { Comparison counter         }

 while p <= q do begin

   i := (p + q) div 2;

   inc(L);

   if A[i] = x then begin

     writeln('Found item i = ', i,

       ' in L = ', L, ' comparisons');

     exit

   end;

   if x < A[i] then

     q := i - 1

   else

     p := i + 1

 end

end;




#define MAXN 10000


int A[MAXN];

int N;


void BinarySearch(int x)

{

 int p, q, i, L;


 p = 0;   /* Left border of the search  */

 q = N-1; /* Right border of the search */

 L = 0;   /* Comparison counter         */

 while (p <= q) {

   i = (p + q) / 2;

   ++L;

   if (A[i] == x) {

     printf("Found item i = %d"

       " in L = %d comparisons\n", i, L);

     return;

   }

   if (x < A[i])

     q = i - 1;

   else

     p = i + 1;

 }

}


Before BinarySearch was called, N was set to some integer number from 1 to 10000 inclusive and array A was filled with a nondescending integer sequence.


It is known that the procedure has terminated with the message "Found item i = XXX in L = XXX comparisons" with some known values of i and L.


Your task is to write a program that finds all possible values of N that could lead to such message. However, the number of possible values of N can be quite big. Thus, you are asked to group all consecutive Ns into intervals and write down only first and last value in each interval.


Input

The input file consists of several datasets. Each datasets consists of a single line with two integers i and L (0 ≤ i < 10000 and 1 ≤ L ≤ 14), separated by a space.


Output

On the first line of each dataset write the single integer number K representing the total number of intervals for possible values of N. Then K lines shall follow listing those intervals in an ascending order. Each line shall contain two integers Ai and Bi (Ai ≤ Bi) separated by a space, representing first and last value of the interval.


If there are no possible values of N exist, then the output file shall contain the single 0.


Sample Input

10 3

Sample Output

4

12 12

17 18

29 30

87 94

importjava.io.BufferedReader;
importjava.io.InputStreamReader;
importjava.io.PrintWriter;
importjava.io.OutputStreamWriter;
importjava.io.StreamTokenizer;
importjava.io.IOException;
classMain{
publicStreamTokenizertokenizer;
publicPrintWritercout;
publicintn, l;
publicvoidinit()
    {
BufferedReadercin=newBufferedReader(newInputStreamReader(System.in));
tokenizer=newStreamTokenizer(cin);
cout=newPrintWriter(newOutputStreamWriter(System.out));
    }
publicbooleaninput() throwsIOException    {
tokenizer.nextToken();
if (tokenizer.ttype==StreamTokenizer.TT_EOF) returnfalse;
n= (int)tokenizer.nval;
tokenizer.nextToken();
l= (int)tokenizer.nval;
returntrue;
    }
publicbooleancheck(intx)
    {
intp=0, q=x-1, m;
intcnt=0;
while (p<=q) {
m= (p+q) >>1;
cnt++;
if (cnt>l) returnfalse;
if (m==n) returncnt==l;
if (m<n) p=m+1;
elseq=m-1;
        }
returnfalse;
    }
publicvoidsolve()
    {
int[] left=newint[10001], right=newint[10001];
intcnt=0;
booleanflag=false;
for (inti=n+1; i<10001; i++) {
if (check(i)) {
if (!flag) {
left[cnt] =i;
flag=true;
                }
            } else {
if (flag) {
right[cnt++] =i-1;
flag=false;
                }
            }
        }
if (flag) right[cnt++] =10000;
cout.println(cnt);
for (inti=0; i<cnt; i++) {
cout.println(left[i] +" "+right[i]);
        }
cout.flush();
    }
publicstaticvoidmain(String[] args) throwsIOException    {
Mainsolver=newMain();
solver.init();
while (solver.input()) {
solver.solve();
        }
    }
}
目录
相关文章
|
缓存 前端开发 JavaScript
深入了解 Vite:快速、简洁、高效的前端构建工具(上)
深入了解 Vite:快速、简洁、高效的前端构建工具(上)
|
C++ 容器
【C++】STL之空间配置器(了解)
【C++】STL之空间配置器(了解)
|
存储 分布式计算 搜索推荐
ES自定义评分机制:function_score查询详解
ES自定义评分机制:function_score查询详解
2057 0
ES自定义评分机制:function_score查询详解
|
人工智能 BI 开发者
|
Java Spring
SpringBoot核心特性——异步任务和定时任务那些事
前言 通常情况下,SpringMVC接收到请求后会将请求具体分发给单个线程进行处理。如果请求处理中涉及到比较耗时的操作,为了能更快地将响应返回给用户,那么就需要将耗时的业务操作交由别的线程进行异步处理,而SpringBoot已经为我们提供了这样的实现。
925 2
SpringBoot核心特性——异步任务和定时任务那些事
|
缓存 负载均衡 算法
SpringCloud极简入门-客户端负载均衡Ribbon
我们知道,为了防止应用出现单节点故障问题,同时为了提高应用的作业能力,我们需要对应用做集群 ,如果我们对user-server(用户服务)做了集群 ,那么这个时候回衍生出一些问题:现在有两个user-server(用户服务)就意味着有两个user-server(用户服务)的通信地址,我的order-server(订单服务)在向user-server(用户服务)发起调用的时候该访问哪个?如何访问?这个时候就需要有一个组件帮我们做请求的分发,即:负载均衡器,而Ribbon就是一个客户端负载均衡器。
249 0
|
开发工具 Docker Python
成功解决使用yum安装软件的时候提示/var/run/yum.pid被锁定
成功解决使用yum安装软件的时候提示/var/run/yum.pid被锁定
1809 0
成功解决使用yum安装软件的时候提示/var/run/yum.pid被锁定
|
SQL 存储 缓存
一文读懂MySQL查询语句的执行过程
一文读懂MySQL查询语句的执行过程
447 0