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
本题的数据量小、限时要求低,可以不用栈来完成。
题解:
由于数据量小,可以直接用从这个数向后找第一个比它大的数的方法,如果找完了整个序列,在这个数的后面没有比这个数大的 ,那么就为-1,最后一个数由于后面没有数,就直接为-1
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int t,i,j,n,a[1100],b[1100],k; 7 scanf("%d",&t); 8 for(k=1; k<=t; k++) 9 { 10 int y=0; 11 scanf("%d",&n); 12 for(i=0; i<n; i++)scanf("%d",&a[i]); 13 for(i=0; i<n-1; i++) 14 { 15 for(j=i+1; j<n; j++) 16 { 17 if(a[j]>a[i]) 18 { 19 b[y++]=a[j]; 20 break; 21 22 } 23 else if(j==n-1&&a[j]<=a[i]) 24 b[y++]=-1; 25 26 } 27 28 } 29 b[n-1]=-1; 30 for(i=0; i<n; i++)printf("%d-->%d ",a[i],b[i]); 31 if(k!=t)printf(" "); 32 33 } 34 35 return 0; 36 }
用栈来完成
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define stackmax 10000 4 #define stacknum 10000 5 typedef int Elemtype; 6 typedef struct 7 { 8 Elemtype *base; 9 Elemtype *top; 10 int stacksize; 11 }Sqstack; 12 void Initstack(Sqstack *S) 13 { 14 S->base=(Elemtype *)malloc(stackmax*sizeof(Elemtype)); 15 if(!S->base) exit(0); 16 S->top=S->base; 17 S->stacksize=stackmax; 18 }//栈的初始化 19 void Push(Sqstack *S,int e) 20 { 21 if(S->top-S->base>=S->stacksize) 22 { 23 S->base=(Elemtype *)realloc(S->base,(S->stacksize+stacknum)*sizeof(Elemtype)); 24 if(!S->base) exit(0); 25 S->top=S->base+S->stacksize; 26 S->stacksize=S->stacksize+stacknum; 27 } 28 *(S->top)=e; 29 S->top++; 30 }//入栈操作 31 int Pop(Sqstack *S) 32 { 33 int e; 34 if(S->top==S->base) return -1; 35 e=*(S->top-1); 36 S->top--; 37 return e; 38 }//出栈操作 39 void f(Sqstack *S) 40 { 41 int *i,*j;//设置游动指针 42 for(i=S->base;i<=S->top-1;i++) 43 { 44 int f=0;//设置指示变量 45 for(j=i+1;j<=S->top-1;j++) 46 { 47 if(*j>*i)//进行数值上的比较 48 { 49 printf("%d-->%d ",*i,*j); 50 f=1; 51 break; 52 } 53 } 54 if(f==0) printf("%d-->%d ",*i,-1);//在给定数值之后没有更大的数值 55 } 56 } 57 int main() 58 { 59 Sqstack S; 60 int t,i,n,a[1001]; 61 scanf("%d",&t); 62 while(t--) 63 { 64 scanf("%d",&n); 65 Initstack(&S); 66 for(i=1;i<=n;i++) 67 { 68 scanf("%d",&a[i]); 69 Push(&S,a[i]); 70 }//将题目所给给的数据入栈 71 f(&S);//进行比较 72 if(t!=0) printf(" ");//若非最后一组,多输出一行空格,要注意判断是否为最后一组的条件是t是否为零,而不是一 73 } 74 return 0; 75 }
用数组完成
1 #include<stdio.h> 2 #include<stdlib.h> 3 int a[1010],b[1010]; 4 int main() 5 { 6 int t,n,m; 7 scanf("%d",&t); 8 for(int j=1;j<=t;j++) 9 { 10 int top=0,top1=0; 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 { 14 scanf("%d",&m); 15 a[++top]=m; 16 }//输入数据,并把它存在一个数组里 17 for(int i=1;i<=top;i++) 18 { 19 int f=0;//设置指示变量 20 for(int t=i;t<=top;t++) 21 { 22 if(a[t]>a[i]) 23 { 24 b[++top1]=a[t]; 25 f=1; 26 break; 27 }//进行数值上的比较,判断是否有更大值,如果有,则把数值存在另一个数组里,便与输出 28 } 29 if(f==0)b[++top1]=-1;//若没有,则把-1存在另一数组里 30 } 31 for(int i=1;i<=top;i++) 32 { 33 printf("%d-->%d ",a[i],b[i]); 34 }//按格式输出两个数组 35 if(j!=t)printf(" ");//若不是最后一组数据,要多输出一行空格 36 } 37 return 0; 38 }