这道题说是暴力枚举的很简单,但是依然让我绕了半天才理解。下面介绍两种办法来枚举。
第一种,找山峰和山底的个数,山谷的个数就是山峰和山底的个数的二分之一。
#include
int main()
{
int t,i,n,h[10005],num,flag;
while(~scanf("%d",&n))
{
num=0;
flag=1; //标记上升为1
for(i=0;i
scanf("%d",&h[i]);
for(i=0;i
{
if(flag&&h[i]>h[i+1]) //从上升到下降即为山峰
{
num++;
flag=0;
}
else if(!flag&&h[i+1]>h[i]) //从下降到上升即为山底
{
num++;
flag=1;
}
}
printf("%d\n",num/2);
}
}
上面这种办法使用标记容易搞混,下面的这种办法是直接看的大牛的代码搞懂的,用pre为前一个值,now为当前值,nxt为下一个值,直接寻找山谷。
一下是代码,方便一下理解~~
#include
int main()
{
int t,i,j,now,pre,nxt,n,ans;
while(~scanf("%d",&n))
{
scanf("%d%d",&pre,&now);
ans=0;
if(now>pre)
pre=now;
for(i=2;i
{
scanf("%d",&nxt);
if(nxt>now&&now
{
ans++;
pre=now=nxt;
}
else if(nxt>now)
pre=now=nxt;
else
now=nxt;
}
printf("%d\n",ans);
}
return 0;
}