Notice that the number on each element of the array indicates how many times the element can spread its red color to adjacent elements. Therefore, each consecutive strips of non-zero elements can be painted with one coin.
Then, the point of this problem lies with the patches of zero element.
For each isolated zero element, one coin is certainly required to paint it red. However, for each non-zero patch, at least one and at most two adjacent zero elements can be painted for free, depending on whether there is an element equal to 2 2 2. Therefore, we can simply implement a two-pointer method that greediely paints the zero-elements using the trickle-down effect of the non-zero patches.
In my code, I greedily paint the leftmost zero-elements first. Notice border conditions require special conditions (e.g. no zero elements at the first or last elements).
#include<cstdio>
#include<iostream>
using namespace std;
const int Maxn=2e5+10;
int a[Maxn];
int n,ans;
inline int read()
{
int s=0,w=1;
char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return s*w;
}
int main()
{
// freopen("in.txt","r",stdin);
n=read();
for(int i=1;i<=n;++i)
a[i]=read();
int l=1,r=1;
while(l<=n)
{
// printf("l = %d\n",l);
bool flag=0;
r=l;
while(!a[r] && r<=n)++ans,++r;
while(a[r] && r<=n)flag|=(a[r++]==2);
++ans;
if(!a[l])--ans;
if(flag && r<=n || a[l])l=r+1;
else l=r;
}
printf("%d\n",ans);
return 0;
}