问题 B: 打印极值点下标
题目描述
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数,或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入
每个案例的输入如下:
有2×n+1行输入:第一行是要处理的数组的个数n;
对其余2×n行,第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出
每个案例输出不多于n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔,如果没有极值点则不输出任何东西。
样例输入 Copy
2
4
1 2 1 3
5
3 4 5 6 7
样例输出 Copy
0 1 2 3
0 4
思路分析:把输入的数组分为三个部分。head,middle,tail。第一个数只要于第二个数不相等,则其为极值;中间的元素可以用题目中极值的定义条件进行判断;最后一个元素只要不等于倒数第二个元素,则其为极值。
代码时间:
#include <iostream>
#include <cstdio>
using namespace std;
int s[100],s1[100];//s用来存放输入的数组元素,s1用来存放极值的下标
int main()
{
int n,m,k=0;
while(scanf("%d",&n)!=EOF)//组数
{
//存放数组元素
while(n--)
{
scanf("%d",&m);//一个数组的元素个数
s[100]=0,s1[0]= {0},k=0;
for(int i=0; i<m; i++)
{
scanf("%d",&s[i]);
}
if(s[0]!=s[1])//head
{
s1[0]=0;
k++;
}
for(int i=1; i<m-1; i++)//middle
{
if((s[i]>s[i-1]&&s[i]>s[i+1])||(s[i]<s[i-1]&&s[i]<s[i+1]))
{
s1[k]=i;
k++;
}
}
if(s[m-1]!=s[m-2])//tail
{
s1[k]=m-1;
k++;
}
if(k>0)//如果数组s1不为空,输出
{
for(int i=0; i<k-1; i++)
{
printf("%d ",s1[i]);
}
printf("%d\n",s1[k-1]);//最后一个无空格,直接换行
}
}
}
return 0;
}