花匠(NOIP2013)(神奇纯模拟)

原题传送门

这是道很奇怪的题目,真不知道为什么要放到T2。

也许是T1太水了

首先先看题,

题目要求一个数列中下标为偶数的点比临近的下表为奇数的点更大或更小

其实就是说在原数组中找到一个最长的波动数列,就是小大小大小大。。。或者大小大小大小

网络上的题解都写的奇奇怪怪,有的用递归,有的用贪心。。

其实没有那么麻烦。 我们假设从第一个数之后开始所有的点都是拐点。

然后就设一个BOOL 如果bool=1那么就判断a[i]>a[i-1]如果满足ans++;bool=0;

如果bool=0那么就判断a[i]<a[i-1]如果满足ans++;bool=1;

如果a[i]=a[i-1]那么a[i]一定不会纳入答案中、。

最后要把ans+1因为第一个点一定要纳入答案。(具体自己贪心证明。。)

所以。。纯模拟就好啦。。

好吧,没有注意事项。

这么简短的代码都20ms膜拜用了读入优化和输出优化的zxyer(才用了4ms%%%%)

下面贴代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,a,b,ans=0,k=0;
int main(){
    scanf("%d%d",&n,&a);
    for(int i=2;i<=n;i++)
    {
        scanf("%d",&b);
        if(b>a&&k!=1)k=1,ans++;
        if(b<a&&k!=2)k=2,ans++;
        a=b;
    }
    printf("%d",ans+1);
}
原文地址:https://www.cnblogs.com/ghostfly233/p/6849039.html