【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

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

不会写搜索的蒟蒻】

转载于:https://www.cnblogs.com/CYWer/p/6056965.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值