时限:1000ms 内存限制:10000K 总时限:3000ms
描述:
给定一个单调递增的整数序列,问某个整数是否在序列中。
输入:
第一行为一个整数n,表示序列中整数的个数;第二行为n(n不超过10000)个整数;第三行为一个整数m(m不超过50000),表示查询的个数;接下来m行每行一个整数k。
输出:
每个查询的输出占一行,如果k在序列中,输出Yes,否则输出No。
输入样例:
5
1 3 4 7 11
3
3
6
9
输出样例:
Yes
No
No
来源:
程序代码:
方法一:
#include <stdio.h>
void search(int m, int n, int *a, int e) // m是查找的起点 n结束
{
if (a[m]==e||a[n]==e)
{
printf("Yes\n");
return;
}
if (e>a[m]&&e<a[n]&&(n-m==1))
{
printf("No\n");
return;
}
else if (m==n)
{
printf("No\n");
return;
}
else if(e>=a[(m+n)/2])
{
m=(m+n)/2;
search(m, n, a, e);
}
else
{
n=(m+n)/2;
search(m, n, a, e);
}
}
int main()
{
int a[11]={0}, b[6]={0};
int number1, number2;
scanf("%d",&number1);
for (int i=0; i<number1; i++)
scanf("%d", &a[i]);
scanf("%d\n",&number2);
for (i=0; i<number2; i++)
scanf("%d", &b[i]);
for (i=0; i<number2; i++)
search(0, number1-1, a, b[i]);
return 0;
}
方法二:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int NBinarySearch(int n,int s[],int x);
int n;
int i;
int s[10000];
int m;
int k;
int l;
int j[50000];
int h;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
}
scanf("%d",&m);
for (k=0;k<m;k++)
{
scanf("%d",&j[k]);
}
for (k=0;k<m;k++)
{
l=j[k];
h=NBinarySearch(n,s,l);
if(h==-1)
printf("No\n");
else
printf("Yes\n");
}
}
int NBinarySearch(int n,int s[],int x)
{
int low=0,high=n-1;
while (low<=high)
{
int mid=(low+high)/2;
if(x==s[mid])
return mid;
else
if(x>s[mid])
low=mid+1;
else
high=mid-1;
}
return -1;
}