ZCMU-1273: 夫妻

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;
}

猜你喜欢

转载自blog.csdn.net/waterboy_cj/article/details/81130465