SDUT 3330 顺序表应用6:有序顺序表查询
顺序表应用6:有序顺序表查询
Time Limit: 1000 ms Memory Limit: 4096 KiB
Problem Description
顺序表内按照由小到大的次序存放着n个互不相同的整数,任意输入一个整数,判断该整数在顺序表中是否存在。如果在顺序表中存在该整数,输出其在表中的序号;否则输出“No Found!"。
Input
第一行输入整数n (1 <= n <= 100000),表示顺序表的元素个数;
第二行依次输入n个各不相同的有序非负整数,代表表里的元素;
第三行输入整数t (1 <= t <= 100000),代表要查询的次数;
第四行依次输入t个非负整数,代表每次要查询的数值。
保证所有输入的数都在 int 范围内。
Output
输出t行,代表t次查询的结果,如果找到在本行输出该元素在表中的位置,否则本行输出No Found!
Sample Input
10 1 22 33 55 63 70 74 79 80 87 4 55 10 2 87
Sample Output
4 No Found! No Found! 10
提示:本题可以通过二分查找来完成,也是应用了顺序表和数组类似的原理。
代码实现如下(gcc):
#include<stdio.h> #include<stdlib.h> int a[100010]; int setlist(int l,int r,int k) { int i=l,j=r,mid; if(i<=j) { mid=(l+r)/2; if(a[mid]==k) return mid; else if(a[mid]>k) setlist(l,mid-1,k); else if(a[mid]<k) setlist(mid+1,r,k); } else return -1; } int main() { int n,m,t,key; int i,j; scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); for(i=0;i<m;i++) { scanf("%d",&key); t=setlist(0,n,key); if(t==-1) printf("No Found!\n"); else printf("%d\n",t+1); } return 0; } /*************************************************** Result: Accepted Take time: 80ms Take Memory: 492KB ****************************************************/