【题述】
Description
有n对夫妻围成一个圈站,他们每个人被连续的编号为1至2n。丈夫和妻子不一定站在一起。现在,对于一对夫妻,如果他们两人中间没有隔任何其他人(站在一起),那么,他们将牵手离开。直到所有人都离开或者留下的人不能成功牵手,游戏结束。
现在请问:是否所有的夫妻都能成功牵手走出这个圆圈呢?
Input
输入包含多组测试数据。每组测试数据中,第一行为一个整数n(1<=n<=100000),表示有n对夫妻。之后的n行中,每行包含两个整数a和b,表示a与b是一对夫妻,他们初始时站的位置为a和b。
n=0表示程序终止输入。
Output
如果所有的夫妻都能成功牵手离开,输出“Yes”,否则,输出“No”。
Sample Input
4 1 4 2 3 5 6 7 8 2 1 3 2 4 0
Sample Output
Yes No
思路:
使用栈,读取,相邻两个栈是夫妻的离开(push),直到栈空(YES),无法栈空的话(NO).ab代表夫妻的位置 ,i循环n次,给每一对夫妻附上同一个值i,用判断每个栈的i的值是否一样来判断他们是否是夫妻。
【我的代码(通过代码)】
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int maxn=200000+10;
int arr[maxn];
stack<int> s;
int main(){
int i,a,b,n,j;
while(scanf("%d",&n)!=EOF){
memset(arr,0,sizeof(arr));
if(n==0)break;
for(i=0;i<n;i++){
scanf("%d%d",&a,&b);
arr[a]=i;
arr[b]=i;//这里注意a,b的值>=1,<=n;
}
s.push(arr[1]);//先丢一个进去;
for(j=2;j<=n*2;j++){//这里注意n表示几对夫妻,总人数是2n
if(s.empty())
s.push(arr[j]);//如果栈空了,就在丢一个进去
else{
if(s.top()==arr[j])
s.pop();//进来的这个与已经在栈里的栈顶元素(就是前一个进来的,在栈顶)比较,如果确认他们是夫妻,就把它们丢出去
else
s.push(arr[j]);//他们不是夫妻,就把刚刚读取也丢进来
}
}
if(!s.empty())
printf("No\n");
else
printf("Yes\n");
}
return 0;
}