1461 Search Problem (IV)
Description
查找(Search)也翻译成搜索,是计算机科学中的一个很大的子类,也是一种计算机的最常见应用。其核心是利用现代电子计算机的存储能力将数据收集起来,然后用某种查找(搜索)算法在有效的时间内,把需要的数据找出来。
查找(搜索)算法是利用计算机的高性能来有目的的穷举一个问题解空间的部分或所有的可能情况,从而求出问题的解的一种方法。查找(搜索)算法按照操作次序可以分成三大类:顺序查找(深度优先、广度优先)、二分查找、直接计算存储位置(如Hash表)。针对应用的性能要求和问题规模,选择不同的查找(搜索)算法。
在解决查找(搜索)的问题时,首先考虑数据组织与结构的问题,即在程序中用何种形式存储数据的。一般根据数据集中数据元素间的相互关系:一对一、一对多、多对多,分别组织成:有序表(也叫线性表)、树、图。这就是构造数据抽象的过程。
利用数据元素间存储位置的顺序关系来组织的结构一般称作数组(Array)、也做列表(list)或向量(Vector),所有的高级程序设计语言都会支持这种存储结构。计算机的内存储器就是按照这种方式来组织的,因此这也是计算机中最基本的存储结构。
数组是这样一种描述一对一关系的数据组织结构:任何一个数据元素都有一个固定的存储位置,每个位置前、后各仅有一个相邻的存储位置。数组中元素的存储位置之间满足一对一的线性序关系,因此可以用自然数来描述每个存储位置上的数据元素,这些自然数就是数组元素的唯一标识——下标。
数组的存储组织结构决定了一个事实:易于存取数据元素、难于改变存储结构。存取数组中数据元素的操作代价可以不计,修改数组中数据元素的代价非常大。因此,数组适用于一次性把数据存储好,不改变或者很少改变数据元素间相互关系的应用中,不适用于那些需要边使用数据边修改结构的问题。
利用数组解决数据查找(搜索)问题的基本步骤是:把数据存储到数组中,按合理的操作次序把想要的数据找出来。关键点是:合理利用下标和数据元素之间的对应关系,解决应该存储什么、以什么顺序存储的问题。
你要解决的问题是:在给定的一个整数序列中,按照要求解决一个查找(搜索)问题。
Input
输入分为两部分:第一部分是第一行,有N+1个整数,第一个正整数为N(N<=10000),表示后跟一个有N个元素的整数序列。
第二部分从第二行开始直到EOF结束,每行为一个整数i。
Output
输出为多行,与输入的第2部分顺序对应,每行输出为:
若i>0,从输入的整数序列中找到第i个整数并输出它的值,若i<0,从输入的整数序列中找到倒数第i个整数并输出它的值,若i不在整数序列的下标范围(1~N和-N~-1)内则输出“OUT OF RANGE”。
Sample Input
10 1 2 3 2 3 4 3 3 5 0
1
-2
3
-5
10
100
Sample Output
1
5
3
4
0
OUT OF RANGE
#include <stdio.h>
int main()
{
int N,i,n;
scanf("%d",&N);
int a[N];
for(n=1;n<=N;n++)
{
scanf("%d",&a[n]);
}
while(scanf("%d",&i)!=EOF)
{
if(i<=N&&i>=1)
printf("%d\n",a[i]);
if(i<=-1&&i>=-N)
printf("%d\n",a[N+1+i]);
if(i>N||i<-N||i==0)
printf("OUT OF RANGE\n");
}
return 0;
}