Description
已知一个已经从小到大排列好的数组,所谓这个数组中的一个平台,就是连续的一串值相同的元素,并且这一串元素不能再延伸。例如,在 1,2,2,3,3,3,4,5,5,6 中 1、2,2、3,3,3、4、5,5、6 都是平台。试编写一个程序,接收一个数组,输出这个数组中所有平台和最长平台的个数与长度。
Input
本题有多组输入数据。第一行是输入数据的组数T,每组数据有两行,第一行是一个整数n,表示下一行有n个数据输入,每个输入数据后有一个空格。1<=T<=20,1<=n<=1000。
Output
对应每组数据,应输出两行,第一行是两个用空格隔开的数(注意该行尾没有空格),第一个数表示最长平台的个数,第二个数表示最长平台的长度,第二行是所有的平台,平台应按在数组中出现的顺序输出,最后一个平台后没有空格。
Sample Input
1
10
1 2 2 3 3 3 4 5 5 6
Sample Output
1 3
{1},{2,2},{3,3,3},{4},{5,5},{6}
解法:
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int main() 5 { 6 int i,T,n; 7 scanf("%d",&T); 8 for(i=0;i<T;i++) 9 { 10 scanf("%d",&n); 11 int j,a[1010]; 12 for(j=0;j<n;j++) 13 { 14 scanf("%d",&a[j]); 15 } 16 int max=a[0],b[1010]={},count=0,s=0,c[1010]={},min=0; 17 c[0]=max; 18 for(j=0;j<n;j++) 19 { 20 if(a[j]==max) 21 count++; 22 if(a[j]>max) 23 { 24 max=a[j]; 25 b[s]=count; 26 if(b[s]>min) 27 min=b[s]; 28 count=1; 29 c[s+1]=max;//每个平台的数字 c[] 30 s++;//s+1表示有的平台数 31 } 32 if(j==n-1) 33 { 34 b[s]=count; 35 if(b[s]>min) 36 min=b[s]; 37 } 38 } 39 int l; 40 for(j=0;j<s+1;j++) 41 { 42 if(b[j]==min) 43 { 44 l++; 45 } 46 } 47 printf("%d %d\n",l,min); 48 l=0; 49 int x,y=0; 50 for(j=0;j<s+1;j++) 51 { 52 printf("{"); 53 for(x=0;x<b[y];x++) 54 { 55 if(x<=b[y]-2) 56 printf("%d,",c[j]); 57 else if(x==b[y]-1) 58 printf("%d",c[j]); 59 } 60 if(j<=s-1) 61 printf("},"); 62 else if(j==s) 63 printf("}"); 64 y++; 65 } 66 printf("\n"); 67 } 68 return 0; 69 }