游客 Signup | Login
中文 | En

1508 - 打印极值点下标

在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。

Input

每个案例的输入如下:

有2×n+1行输入:第一行是要处理的数组的个数n;

对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。

Output

每个案例输出不多于n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔,如果没有极值点则不输出任何东西。

Examples

Input

2
4
1 2 1 3
5
3 4 5 6 7

Output

0 1 2 3
0 4

Solution C

int main(int argc, char* argv[])
{int n,m,i,a[81],b[81],j;
while(~scanf("%d",&n)){
while(n--)
{
scanf("%d",&m);
for(i=0;i<m;i++)
scanf("%d",&a[i]);
j=0;
for(i=0;i<m;i++)
{if(i==0){if(a[0]>a[1]||a[0]<a[1])b[j++]=i;}
else if(i==m-1){if(a[m-1]>a[m-2]||a[m-1]<a[m-2])b[j++]=i;}
else {if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))b[j++]=i;}
}

for(i=0;i<j;i++)
printf(j-i==1?"%d\n":"%d ",b[i]);
}
}
	return 0;
}

Solution C++

#include<stdio.h>

int main()
{
	int n,k,a[80],i,b[80],j;
	while(scanf("%d",&n)!=EOF)
	{
		while(n--)
		{
			scanf("%d",&k);
			for(i=0;i<k;i++)
				scanf("%d",&a[i]);
			j=0;
			if(a[0]<a[1]||a[0]>a[1])
				b[j++]=0;
			for(i=1;i<k-1;i++)
				if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))
					b[j++]=i;
			if(a[k-1]<a[k-2]||a[k-1]>a[k-2])
				b[j++]=k-1;
			for(i=0;i<j;i++)
				printf(i==j-1?"%d\n":"%d ",b[i]);
		}
	}
	return 0;
}
Time Limit 1 second
Memory Limit 32 MB
Discuss Stats
上一题 下一题