链接http://codeforces.com/problemset/problem/731/B
思路
首先,不管输入多少,a[i],a[i+1]都可以变成0,1, 2
因为不管是在一个堆里取两个还是在两个堆里各取一个最终状态都是0,1,2
然后对每个堆判断
如果=0 contiue
如果=1 选择在两个堆里各取一个
如果=2 在一个堆里取两个
然后判断是否符合条件
说实话,这个题是胡搞出来的..
#include<bits/stdc++.h>
using namespace std;
int n;
int a[200005];
int main(){
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]==0)
a[i]=0;
else if(a[i]&1)
a[i]=1;
else if((a[i]&1)==0)
a[i]=2;
}
/*
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
*/
int flag=0;
for(int i=0;i<n;i++){
if(a[i]==0){
continue;
}
else{
if(i!=n-1){
if(a[i+1]==0){
if((a[i]&1)==0)
continue;
else{
//printf("i=%d,a[%d]=%d\n",i,i,a[i]);
flag=1;
break;
}
}
if(a[i+1]!=0){
if(a[i]&1)
a[i]-=1,a[i+1]-=1;
else
a[i]-=2;
}
}
if(i==n-1){
if(a[i]&1){
flag=1;
break;
}
else
a[i]-=2;
}
}
}
if(flag)
printf("NO\n");
else
printf("YES\n");
return 0;
}