1273: 夫妻
Time Limit: 1 Sec Memory Limit: 32 MB
Submit: 359 Solved: 80
[Submit][Status][Web Board]
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
HINT
Source
解题思路:
将一对夫妻编为1个号,比如题中第一例将c数组的第一个和第四个位置都标记为1,第二个和第三个位置都标记为2,依次类推,然后运用栈,将需要入栈的元素与栈顶元素作比较,如果相等则栈顶元素出栈,本要入栈元素不入栈,即牵手成功,如果最后栈内为空,则表示所有夫妻都牵手成功,输出Yes,反之则输出No。
代码:
#include<bits/stdc++.h>
using namespace std;
int c[200005];
int main()
{
int n;
while(~scanf("%d",&n) && n){
int a,b,flag=0;
for(int i=1;i<=n;i++){
scanf("%d%d",&a,&b);
c[a]=i;c[b]=i;
}
stack<int>s;
s.push(c[1]);
for(int i=2;i<=2*n;i++){
if(s.empty())s.push(c[i]);
else{
if(s.top()==c[i])s.pop();
else s.push(c[i]);
}
}
if(s.empty())printf("Yes\n");
else printf("No\n");
}
return 0;
}