P5019 铺设道路

在这里插入图片描述

这是一道贪心题,但刚开始我还没看出来,只好用递归来做。可能是时间太宽裕了,暴力竟然也过了。暴力来说,应该还算比较好理解吧,对于4 3 2 5 3 5 我们找到其中最小的一个数字,如果有多个就选择其最靠前的一个就行(其实任意一个都可以,然后使得数组里面所有的元素全部减去2,就变成了
2 1 0 3 1 3 然后 加上这个数并对左右两边分别进行递归,AC代码如下:

#include <iostream>
int get_res(int a[],int begin,int end);
using namespace std;
    int main()
    {
        int n;
        cin>>n;
        int a[n+1];
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        cout<<get_res(a,1,n);
        return 0;
    }

    int get_res(int a[],int begin,int end)
    {
        if(begin==end)
        {
            return a[begin];
        }
        else if(begin>end)
        {
            return 0;
        }
        int Mins=begin;
        int Min=a[begin];
        for(int i=begin;i<=end;i++)
        {
            if(a[i]<Min)
            {
                Min=a[i];
                Mins=i;
            }
        }
        for(int i=begin;i<=end;i++)
        {
            a[i]-=Min;
        }
        return Min+get_res(a,begin,Mins-1)+get_res(a,Mins+1,end);
}

除此之外,还有一个更简单的做法,那就是贪心:贪心可能不是很好理解,自己多走一走过程就清楚了,就比如:上文中的样例:4 3 2 5 3 5 ,从a[1]开始考虑(数组下标从1开始),可以看到第一个深度为4,第二个深度为3,考虑a[2],如果第一个a[1]填好了,那么第二个a[2]也一定填好了,所以总天数是sum=sum+a[1],再考虑a[3],同理,也跟着前面的,sum值不变,到了a[4],很显然a[4]>a[3],那么sum=sum+a[4]-a[3]即可,因为a[3]一定是在a[4]之前先填完,并且题目中说了又不能填深度为0的,所以后面还要单独填a[4]-a[3]个,a[5]<a[4],他可以跟着前面的a[4]一起填,然后到了a[6],同理sum=sum+a[6]-a[5] ,下面附上AC代码:*

#include <iostream>
#include <cstring>
int get_tanxi(int a[],int begin,int end);
using namespace std;
    int main()
    {
        int n;
        cin>>n;
        int a[n+1];
        memset(a,0,sizeof(a));
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        cout<<get_tanxi(a,1,n);
        return 0;
    }


 int get_tanxi(int a[],int begin,int end)
     {
            int sum=0;
            for(int i=begin;i<=end;i++)
            {
                if(a[i]>a[i-1])
                {
                    sum+=a[i]-a[i-1];
                }
            }
            return sum;
    }

怎么样,是不是比之前的暴力要简单很多,所以掌握贪心以后,会节省很多代码。效率也变成了0(n),高效率 AC两开花~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值