算法 19. 横竖填坑 #include <cstdio> #include <cstring> #include <stack>//此题和20题差距不大,可以直接照搬一部分代码 using namespace std; long long int lake[2000005]; stack <long long int> s; int main() { long long int n; long long int max,sub; long long int count; while(scanf("%lld",&n)!=EOF) { max=0; count=0; memset(lake,0,sizeof(lake[0])); while(!s.empty()) { s.pop(); }//清空数据 for(long long int i=0;i<n;i++) { scanf("%lld",&lake[i]); if(lake[i]>max) { max=lake[i]; } }//保留最大位置 for(long long int i=0;i<n;i++) { sub=max-lake[i]; if(sub%2==0) { lake[i]=0; } else { lake[i]=1; } }//如果和最大高度相差为偶数,则记录这种情况为0,如果和最大高度相差为奇数,则记这种高度为1 for(long long int i=0;i<n;i++) { if(count==0) { s.push(lake[i]); count++; }//如果是空栈,直接将数据压入 else { if(s.top()==lake[i]) { count--; s.pop(); }//如果新的高度和当前高度一致,一起删去 else { s.push(lake[i]); count++; }//如果新的高度和当前高度不一致,压入栈中 } } if(count>1) { printf("NO\n"); }//如果最后栈的长度大于1,则不可能填平 else { printf("YES\n"); }//否则可以填平 } return 0; }