#include
int main()
{
int n,k=0,a[10000];
scanf("%d",&n);
//int a[n];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=1;i<n-1;i++)
{
int mid=a[i];
int left=a[i-1],right=a[i+1];
if(right==mid)
{
i++;
right=a[i+1];
}
if(mid<left&&mid<right)k++;
}
printf("%d",k);
}
代码中未考虑数组越界的情况,可以在for循环的判断条件中加入i>0,i<n-1的判断,以防止数组越界。
这个代码是用来解决 P1321 题目的,题目要求是给定一个长度为n的序列,求这个序列中有多少个下降峰值。下降峰值是指一个数比它相邻的两个数都小。
这个代码的算法思路是正确的,但是存在一些问题。
1.数组a的大小是10000,但是题目中只需要n个数,没必要开这么大。
2.在for循环中,应该从i=1开始,因为第一个数不可能是峰值,应该跳过。
3.在判断峰值的条件中,如果mid和right相等,应该跳过,不能直接i++,因为这样会统计两次峰值。
4.在输出结果时,应该输出k而不是n。
5.应该在第一次循环中添加一个判断条件,防止越界。
修改后的代码如下:
#include<stdio.h>
int main()
{
int n,k=0,a[10000];
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=1;i<n-1;i++)
{
int mid=a[i];
int left=a[i-1],right=a[i+1];
if(mid>=left||mid>=right)continue;
k++;
}
printf("%d",k);
}