1273: 夫妻
Time Limit: 1 Sec Memory Limit: 32 MB
Submit: 365 Solved: 85
[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
【解析】
一开始我去找连线,去掉站在一起的夫妻,然后剩下的按顺序连线要是有交叉那就不行。但是WA了几发 ,反复检查我也没有举出反例。。。。然后用栈试了一下,过了。
#include <bits/stdc++.h>
using namespace std;
stack<int> pp;
int main()
{
int n;
int a[200100];
while (scanf("%d", &n))
{
if (!n)break;
memset(a, 0, sizeof(a));
int x, y;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &x, &y);
a[x] = i; a[y] = i;//每个人记住自己的另一半是谁
}
pp.push(a[1]);//将编号为1的人推入栈中
for (int i = 2; i <= 2 * n; i++)//循环所有夫妻
{
if (pp.empty())//当栈中空了则将这个人推入栈
pp.push(a[i]);
else
{
if (pp.top() == a[i]) pp.pop();//如果上一个入栈的人是它的夫妻,则弹出
else pp.push(a[i]);//否则推入栈中等待下一次
}
}
if (!pp.empty()) printf("No\n"); //遍历完所有人,栈为不为空那么则不能
else printf("Yes\n");
}
return 0;
}