CF1467B Hills And Valleys

因为只能修改一次

且每点的修改只能对左右产生影响

画出所有的折线情况

发现贡献只能是3 ,或者1

如果满足-3就-3,否则-1;

但一直wa,又找不着该逻辑的毛病,先放着发酵一会

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6;
int a[maxn],ok[maxn];
int main( )
{
    
//    freopen("lys.in","r",stdin);
    
    int t;
    cin>>t;
    for(int i=1;i<=t;i++)
    {
        int n;
        cin>>n;
        
        for(int j=1;j<=n;j++)
        {
            cin>>a[j];
        }
        if(n==1||n==2)
        {
            cout<<0<<endl;
            continue;
        }
        int cnt=0;
        
        for(int j=2;j<=n-1;j++)
        {
            if((a[j]>a[j-1]&&a[j]>a[j+1])||(a[j]<a[j-1]&&a[j]<a[j+1]))
            {
                ok[j]=1;
                cnt++;
            }
 
        }
        
        for(int j=0;j<=n+10;j++)
        {
            a[j]=0;
        }
        
        int a=0;
        
        for(int j=2;j<=n-1;j++)
        {int p=ok[j]+ok[j+1]+ok[j-1];
          if(p==3)
           {
             a=1;    
           }
        }
        
        if(a==1)
        {
            printf("%d\n",cnt-3);
        }
        else {
            if(cnt>=1)
            {
                printf("%d\n",cnt-1);
            }
            else {
                printf("%d\n",cnt);
            }
        }
        
        for(int j=0;j<=n+10;j++)
        {
            ok[j]=0;
        }
    }
}

 

posted @ 2021-10-03 19:48  liyishui  阅读(23)  评论(0编辑  收藏  举报