题目描述
在一个整数数组上,对于下标为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
这是比较常规的写法:第一个和最后一个单独判断,
#include<cstdio>
const int maxn = 90;
int main(){
int a[maxn];
int n,m,h;
while(scanf("%d",&n)!=EOF){
while(n--){
scanf("%d",&m);
for(int i=0;i<m;i++){
scanf("%d",&a[i]);
}
if(a[0]!=a[1]) printf("0 ");
for(int i=1;i<m-1;i++){
if((a[i]>a[i-1]&&a[i]>a[i+1])||(a[i]<a[i-1]&&a[i]<a[i+1]))
printf("%d ",i);
}
if(a[m-1]!=a[m-2]) printf("%d\n",m-1);
//printf("\n");
}
}
return 0;
}
这个是比较有灵性的一种写法:秒处在于使用了一个flag作为标记判断前面是否有极值,从而决定是否输出空格。
#include <iostream>
using namespace std;
int main()
{
int n, k;
while (cin >> n)
{
while (n--)
{
cin >> k;
int A[k], flag = 0; // flag标记是否存在极值,也标记在某个元素前是否已经有极值输出过了
for (int i = 0; i < k; ++i)
cin >> A[i];
if (A[0] != A[1]) // 数组头尾元素单独判断
cout << 0, flag = 1;
for (int 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]))
{
if (flag) // flag为1表明在A[i]前有输出,所以要跟空格
cout << ' ';
cout << i, flag = 1;
;
}
}
if (A[k - 1] != A[k - 2]) // 题目保证了k>4,所以不用担心不存在k - 2
{
if (flag)
cout << ' ';
cout << k - 1, flag = 1;
}
if (flag)
cout << endl;
}
}
}