刚读完题的时候我完全是蒙了的状态,在观摩了刘。。的代码之后,我依旧觉得不太对,但是我有了一点思路。随后,我写出来了一个思路完全不一样的代码
#include<bits/stdc++.h>
#define ll long long
#define st string
using namespace std;
int a[100005];
int main()
{
memset(a,0,sizeof(a));
int n;
cin>>n;
cin>>a[1];
int ans=0;
for(int i=2;i<=n;i++) {
cin>>a[i];
if(a[i]>a[i-1]) ans+=a[i]-a[i-1];
}
cout<<ans+a[1]<<endl;
return 0;
}
思路:
我们从第2块积木开始,只有当前面的积木已经搭好了才去管后面的积木。如果a[i]<=a[i-1]那么搭第i-1块积木的时候一定已经搭好第i块积木,否则就需要把它们两个的差补齐。
liujinyu的的代码可能更不好理解一点,就是跟我的思路是反过来的。但是基本是一样的。
像这种巧妙的贪心题我可能还不是很擅长,可能以后有时间才会去处理。但是这道题给我敲了一个警钟:有的时候是需要迅速的反应出来这道题应该用什么东西去做,现在我的反应速度基本上可能还是想不到或者是需要很长时间去想的。所以说还是要多刷题