Problem Description
对于包含n(1<=n<=1000)个整数的序列,对于序列中的每一元素,在序列中查找其位置之后第一个大于它的值,如果找到,输出所找到的值,否则,输出-1。
Input
输入有多组,第一行输入t(1<=t<=10),表示输入的组数;
以后是 t 组输入:每组先输入n,表示本组序列的元素个数,之后依次输入本组的n个元素。
Output
输出有多组,每组之间输出一个空行(最后一组之后没有);
每组输出按照本序列元素的顺序,依次逐行输出当前元素及其查找结果,两者之间以-->间隔。
Sample Input
2 4 12 20 15 18 5 20 15 25 30 6
Sample Output
12-->20 20-->-1 15-->18 18-->-1 20-->25 15-->25 25-->30 30-->-1 6-->-1
Hint
本题的数据量小、限时要求低,可以不用栈来完成。
Source
第一种方法:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[1005] ;
int b[1005] ;
int main()
{
int t ;
int n, i, j ;
int k ;
while(~scanf("%d",&t))
{
for(j = 0 ; j<t ; j++)
{
scanf("%d",&n) ;
for(i = 0 ; i< n ; i++)
{
scanf("%d",&a[i]) ;
}
for(i = 0 ; i< n ; i++)
{
if(i == n-1 )
{
b[i] = -1 ;
}
else
{
for(k = i+1 ; k<n ; k++)
{
if(a[k]>a[i])
{
b[i] = a[k] ;
break;
}
}
if(k == n)
{
b[i] = -1 ;
}
}
}
for(i= 0 ; i<n ; i++)
{
printf("%d-->%d\n",a[i],b[i]) ;
}
if(j!=t-1)
{
printf("\n") ;
}
}
}
return 0 ;
}
第二种方法:
大致思路:首先创建3个数组,一个数组来存放输入的元素,一个数组用来存下较大值,另一个数组来做栈。先把输入的最后一个元素当做栈顶元素,从倒数第二个元素开始如果小于栈顶元素,就把栈顶元素存入存下较大值的数组中,并把当前的元素存入栈中,如果栈顶元素小于输入元素,遍历栈中的元素寻找下较大值,没有找到的话就把-1赋给存较大值的数组,然后把元素存入栈顶。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[100010] , b[100010] ,s[100010] ;
int top = -1 ;
int main()
{
int t ;
int i ,j ;
int n ;
while(~scanf("%d",&t)){
for(i = 0 ; i< t; i++)
{
scanf("%d",&n) ;
top = -1 ;
for(j = 0 ; j< n ; j++)
{
scanf("%d",&a[j]) ;
}
s[++top] = a[n-1] ;
b[n-1] = -1 ;
for(j = n-2 ; j>=0 ; j--)
{
if(a[j]<s[top])
{
b[j] = s[top] ;
s[++top] = a[j] ;
}
else
{
while(s[top]<=a[j]&&(top>=0))
{
top-- ;
}
if(top==-1)
{
b[j] = -1;
s[++top] = a[j] ;
}
else
{
b[j] = s[top] ;
s[++top] = a[j] ;
}
}
}
for(j = 0 ; j< n ; j++)
{
printf("%d-->%d\n",a[j],b[j]) ;
}
if(i!=t-1)
{
printf("\n") ;
}
}
}
return 0 ;
}