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; }