洛谷P1321,示例没问题,想知道代码哪里错了


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