游客 Signup | Login
中文 | En

1909 - 改写二分搜索算法

设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置 i 和大于x的最小元素位置 j。当搜索元素在数组中时,i 和 j 相同,均为x在数组中的位置。

Input

输入的第一行为搜索元素x,第二行为数据元素个数n,第三行为数组各元素。

Output

输出x是否搜索到,如果搜索到返回1,同时输出元素的位置,否则,返回0,输出第i个元素和第j个元素及位置。

Examples

Input

4
5
1 3 5 6 8

Output

0
1
2

Solution C

/*设a[0:n-1]是一个已排好序的数组。请改写二分搜索算法,使得当搜索元素x不在数组中时,
返回小于x的最大元素的位置 i 和大于x的最小元素位置 j。当搜索元素在数组中时,i 和 j 相同,
均为x在数组中的位置。*/
#include<stdio.h>
int main()
{
	void BFind(int *,int ,int,int);
	int x,n,i;
	scanf("%d%d",&x,&n);
	int t[n];
	for(i=0;i<n;i++)
        scanf("%d",&t[i]);
	BFind(t,0,n,x);
	return 0;
}
void BFind(int *t,int m,int n,int x)
{
	while(m<n)
	{
		if(x>t[(m+n)/2])
			m=(m+n)/2+1;
        if(x<t[(m+n)/2])
            n=(m+n)/2-1;
        if(x==t[(m+n)/2])
            {
                printf("1\n%d\n",(m+n)/2);
                return ;
            }
	}
	printf("0\n%d\n%d\n",m,m+1);
	return ;
}

Solution C++

#include<iostream>
using namespace std;
int B(int a[],int x,int n,int &i,int &j)
	{    
		int left=0;
	    int right=n-1;
		while(left<=right)
		{
			int middle=(left+right)/2;
				if(x==a[middle])
					return middle;
				if(x>a[middle])
				left=middle+1;
				else
				right=middle-1;
	
		}
		i=right;
		j=left;
		return -2;
	}
int main()
	{
	
        int x,n;
		int i=0;
		int j=0;
		cin>>x>>n;
		int a[1000];
		for(i=0;i<n;i++)
		cin>>a[i];
		int C=B(a,x,n,i,j);
	if(C>=0)
		cout<<1<<"\n"<<C<<endl;
	else
		cout<<0<<"\n"<<i<<"\n"<<j<<"\n";
}
Time Limit 1 second
Memory Limit 128 MB
Discuss Stats
上一题 下一题