这是一道贪心题,但刚开始我还没看出来,只好用递归来做。可能是时间太宽裕了,暴力竟然也过了。暴力来说,应该还算比较好理解吧,对于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两开花~