zoukankan      html  css  js  c++  java
  • codevs 3289 花匠

    传送门

    3289 花匠

    2013年NOIP全国联赛提高组

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond 
    题目描述 Description

    花匠栋栋种了一排花,每株花都有自己的高度。花儿越长越大,也越来越挤。栋栋决定把这排中的一部分花移走,将剩下的留在原地,使得剩下的花能有空间长大,同时,栋栋希望剩下的花排列得比较别致。
    具体而言,栋栋的花的高度可以看成一列整数h_1, h_2, … , h_n。设当一部分花被移走后,剩下的花的高度依次为g_1, g_2, … , g_m,则栋栋希望下面两个条件中至少有一个满足:
    条件 A:对于所有的1<i<m/2,g_2i > g_2i-1,且g_2i > g_2i+1; 
    条件 B:对于所有的1<i<m/2,g_2i < g_2i-1,且g_2i < g_2i+1。
    注意上面两个条件在m = 1时同时满足,当m > 1时最多有一个能满足。
    请问,栋栋最多能将多少株花留在原地。

    输入描述 Input Description

    输入的第一行包含一个整数 n,表示开始时花的株数。
    第二行包含 n 个整数,依次为h_1, h_2,… , h_n,表示每株花的高度。

    输出描述 Output Description

    输出一行,包含一个整数 m,表示最多能留在原地的花的株数。

    样例输入 Sample Input


    5 3 2 1 2

    样例输出 Sample Output

    3

    数据范围及提示 Data Size & Hint

    对于 20%的数据,n ≤ 10; 
    对于 30%的数据,n ≤ 25; 
    对于 70%的数据,n ≤ 1000,0 ≤ h_i ≤ 1000; 
    对于 100%的数据,1 ≤ n ≤ 100,000,0 ≤ h_i ≤ 1,000,000,所有的h_i随机生成,所有随机数服从某区间内的均匀分布。

    【思路】

    贪心或者是dp 

    本来练习贪心...发现不会...用的dp

    【code】

    T了两个点...黄学长的特判看不懂...

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int h[100003],f[100003][3];
    int n;
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%d",&h[i]);
        f[1][0]=f[1][1]=1;
        for(int i=1;i<=n;i++)
        for(int j=i-1;j>0;j--)
        if(h[i]>h[j])
        f[i][0]=max(f[i][0],f[j][1]+1);
        else
        if(h[i]<h[j])
        f[i][1]=max(f[i][1],f[j][0]+1);
        else
        f[i][1]=max(f[i][1],f[j][1]),
        f[i][0]=max(f[i][0],f[j][0]);
        printf("%d",max(f[n][0],f[n][1]));
        return 0;
    }

    比较好的AC code

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int n,pre,now,r=1,d=1;
    int main()
    {
        scanf("%d",&n);
        scanf("%d",&pre);//当前这盆花前面那盆花的高度,初始为第一盆花的高度。 
        for(int i=1;i<n;i++)
        {
            scanf("%d",&now);
            if(now>pre)r=max(r,d+1);//当前这盆花高度大于前面那盆花高度 
            if(now<pre)d=max(d,r+1);//说明现在是上升序列,就要求出到Now这个花盆且波动为 
            pre=now;             //上升的最优解,就从原来求出的最后波动为上升的最优解,
        }                       //(也就是说此时当前这盆花不加入之前最优解,移走)
        printf("%d",max(r,d));//和从最后波动为下降的最优解+1选取最优值(不移走)。
        return 0;
    }
  • 相关阅读:
    How to install VXDIAG Honda, Toyota and JLR SDD software
    16% off MPPS V16 ECU tuning tool for EDC15 EDC16 EDC17
    Cummins INSITE locked and ask for verification code
    How to use BMW Multi Tool 7.3 to replace lost key for BMW X1
    Bleed Brake Master Cylinder with Intelligent Tester IT2
    Porsche Piwis Tester II “No VCI has been detected”,how to do?
    Creader VIII VS. Creader VII+
    How to solve GM MDI cannot complete the installation
    汽车OBD2诊断程序开发 (原文转载,思路很清晰!)
    汽车节温器单片机开发思路
  • 原文地址:https://www.cnblogs.com/zzyh/p/6994812.html
Copyright © 2011-2022 走看看