- https://ac.nowcoder.com/acm/contest/296/B
- 题意:原来纸条为1-n 为1*n的有序排列,经过各种折叠方式最终折成n*1的可以对折反折等等,问最后给出的序列是否合法
- 思路:通过合法序列找一下规律,发现从 所有数字为奇数的连向其后面为偶数的数字构成的线是不会相交的
- 从所有数字为偶数的连向其后面为奇数的数字构成的线也是不会相交,所以对其所给序列进行这两个检验,
- 注意一下序列的奇偶与边界条件即可。
-
#include<bits/stdc++.h> using namespace std; #define maxn 1234567 int t,n,a[maxn]; int main() { scanf("%d",&t); while(t--) { bool flag=1; scanf("%d",&n); for(int i=1; i<=n; i++) scanf("%d",&a[i]); stack<int>stk,spk; for(int i=1; i<=n; i++) { if(n%2&&a[i]==n)continue; else { if(!stk.empty()&&((stk.top()%2&&stk.top()+1==a[i])||(stk.top()%2==0&&stk.top()-1==a[i]))) stk.pop(); else stk.push(a[i]); } } if(!stk.empty())flag=0; for(int i=1; i<=n; i++) { if((n%2==0&&a[i]==n)||(a[i]==1))continue; else { if(!spk.empty()&&((spk.top()%2&&spk.top()-1==a[i])||(spk.top()%2==0&&spk.top()+1==a[i]))) spk.pop(); else spk.push(a[i]); } } if(!spk.empty())flag=0; if(flag)printf("Yes\n"); else printf("No\n"); } return 0; }
Origami-思维规律-入栈匹配
最新推荐文章于 2024-08-28 09:51:08 发布