• 【NOIP2013】Day2不完全题解+代码


    T1

    直接递归区间,从1-n开始,找到这个区间中的最小值然后将区间里的所有值都减去这个最小值

    以被减去最小值之后的零点为分段分别递归处理即可。

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int block[100003]={0},n=0;
    int solve(int lf,int rt);
    int main(void)
    {
        freopen("block.in","r",stdin);
        freopen("block.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&block[i]);
        int ans=solve(1,n);
        printf("%d",ans);
        return 0;
    }
    
    int solve(int lf,int rt)
    {
        if(lf>rt)return 0;
        if(lf==rt)return block[lf];
        int least=0x7fffffff;
        for(int i=lf;i<=rt;i++)least=min(least,block[i]);
        int tot=least,last=lf;
        for(int i=lf;i<=rt;i++)
        {
            block[i]-=least;
            if(block[i]==0)
            {
                tot+=solve(last,i-1);
                last=i+1;
                continue;
            }
            if(i==rt)tot+=solve(last,rt);
        }
        return tot;
    }
    View Code

    T2

    常规解法是DP然后使用树状数组线段树来加快状态转移速度

    但是这道题有一个结论

    对于花组成的区间,我们可以视作是单调性不同的单调区间拼成的(忽视掉相等的情况),那么在每一个单调区间之中

    很明显选择区间的两个端点是最优选择,那么我们的最优解就是选出所有区间的端点。也即是折点。

    这样就可以O(n)解决。

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    using namespace std;
    int high[100003]={0},n=0;
    int main(void)
    {
        freopen("flower.in","r",stdin);
        freopen("flower.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&high[i]);
        int ans=1;
        bool check=false,check_2=false;
        if(high[2]>high[1])check=true;
        if(high[2]==high[1]&&high[3]>high[1])check=true;
        for(int i=2;i<=n;i++)
        {
            if(high[i]>high[i+1]&&check)
            {
                ans++;
                check=false;
                if(i==n)check_2=true;
                continue;
            }    
            if(high[i]<high[i+1]&&!check)
            {
                ans++;
                check=true;
                if(i==n)check_2=true;
                continue;
            }
        }
        if(!check_2)ans++;
        printf("%d",ans);
        return 0;
    }
    View Code

    T3

    我没写……但是应该就是搜搜搜……

    不会写搜索的蒟蒻】

  • 相关阅读:
    WPF -- PasswordBox数据绑定方法
    WPF -- 窗口Clip+Effect效果
    WPF -- Generic.xaml文件报错
    WebCombo 客户端绑定数据
    NPOI 导入excel
    Bootstrap +mvc实现网络共享文件查阅(应用于企业ISO等共享文件呈现)
    webdatagrid 列样式
    datagridview 设置列对齐及显示数据格式
    datagridview
    webdatagrid 列只读
  • 原文地址:https://www.cnblogs.com/CYWer/p/6056965.html
Copyright © 2020-2023  润新知