#include<iostream>
#include<cstdio>
using namespace std;
const int N=1000+10;
int n,a[N];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
// scanf("%d",a[i]);
/***!!!输入数组需加取地址符,
*否则程序无法运行! ***/
scanf("%d",&a[i]);
}
int ans=0;
// for(int i=1;i<n;i++)//(60')
for(int i=1;i<n-1;++i)
{
if((a[i]-a[i-1])*(a[i+1]-a[i])<0)//异号,数列递推
// if((a[i-1]<a[i]&&a[i]>a[i+1])||(a[i-1]>a[i]&&a[i]<a[i+1]))
ans++;
}
printf("%d",ans);
return 0;
}
- 遇到的问题:
- 程序编译可通过,但无法运行;
- 原因:在输入数组时未加取地址符“&”,即写为:scanf("%d",a[i]);(正确写法:scanf("%d",&a[i]);)
- 故障排除后程序只得60分;
- 原写法:for(int i=1; i<n; i++)
- 满分写法:for(int i=1;i<n-1;++i)
- 原因:计算a[i+1] - a[i],做最后一次比较时i = n,i+1越界
- 优点:
- 在做折点关系比较时,采用数列递推法(单调有界准则,o(^▽^)o),简化代码;
- 我的代码:if ( (a[i] - a[i-1] ) * ( a[i+1] - a[i] ) < 0 )
- 比较:if ( ( a[i-1] < a[i] && a[i] > a[i+1] ) || ( a[i-1] > a[i] && a[i] < a[i+1] ) )
![](https://i-blog.csdnimg.cn/blog_migrate/9e752565df9bdc93c3d58ec8d5122077.png)