山不平何以平天下
刘俊学长在一个深山老林里冒险,这里到处都是山,第i座山的高度记为hi
当hi-1<hi且hi+1<hi时,刘俊学长将会讨厌这座山,也就是第i座山。因为它需要消耗更多的体力翻越。
然而zks是一位魔法师,他可以使一座山凭空消失,而它旁边的两座山会神奇般的连接起来。
例如有7座山,高度为 1 9 1 9 8 1 0 当对第三座山施加魔法时,剩下的六座山为1 9 9 8 1 0
zks希望在释放魔法后,刘俊学长讨厌的山会尽可能的变少。那么最少会有多少座山令刘俊学长讨厌呢? 魔法只能释放一次。
输入
有多组样例测试
第一行为一个整数n,代表有n座山
第二行包含n个正整数 h1,h2,…,hn,代表山的高度
1≤n≤1e5, 0≤hi≤1e9
输出
在释放魔法后,刘俊最少会讨厌的山的数量
样例输入
6
1 1 4 5 1 4
7
1 9 1 9 8 1 0
10
2 1 4 7 4 8 3 6 4 7
样例输出
1
0
2
输入完之后用一个for循环找出原来有多少座讨厌的山,只能删一座山,而且只会影响自己,左边,右边,这三座山,一个for循环在判断一下这三座山会怎么样。
#include<bits/stdc++.h>
using namespace std;
long long a[100005],b[100005];
int main(){
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
int min=0;
a[0]=a[n+1]=10000000000;
for(int i=1;i<=n;i++){
if(a[i]>a[i-1]){
if(a[i]>a[i+1]){
b[i]=1;
min++;
}
else continue;
}
else continue;
}
int min1=min;
int min2=min;
for(int i=1;i<=n;i++){
if(b[i-1]==1&&a[i-1]<=a[i+1])min–;
if(b[i-1]==0&&a[i-1]>a[i+1]&&a[i-1]>a[i-2]&&i>1)min++;
if(b[i+1]==1&&a[i+1]<=a[i-1])min–;
if(b[i+1]==0&&a[i+1]>a[i-1]&&a[i+1]>a[i+2])min++;
if(b[i]==1)min–;
if(min<min1){
int temp=min;
min=min2;
min1=temp;
}
else{
min=min2;
}
}
printf("%d\n",min1);
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
}
}