剛讀完題的時候我完全是蒙了的狀態,在觀摩了劉。。的代碼之後,我依舊覺得不太對,但是我有了一點思路。隨後,我寫出來了一個思路完全不一樣的代碼
#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的的代碼可能更不好理解一點,就是跟我的思路是反過來的。但是基本是一樣的。
像這種巧妙的貪心題我可能還不是很擅長,可能以後有時間纔會去處理。但是這道題給我敲了一個警鐘:有的時候是需要迅速的反應出來這道題應該用什麼東西去做,現在我的反應速度基本上可能還是想不到或者是需要很長時間去想的。所以說還是要多刷題