您的位置:首页 > 其它

ZCMU—1273

2016-11-18 22:24 232 查看

1273: 夫妻

Time Limit: 1 Sec  Memory Limit: 32 M

[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


【分析】
这道题目我一开始的时候不知道做...放了很久才做的..
乍一看以为这道题类似于约瑟夫的模拟,但是考虑到多组数据并且数据较大..一定会超时,所以一开始想不通怎么做。
后来又觉得这道题是在找交叉状态,也就是比如1和2,3和4是夫妻,出现1 3 2 4这种交叉情况,后来发现这只是一种情况...有可能出现连续交叉...
思来想去想不通...后来有一天开始看C语言的<stack>...突然有了个想法...
用栈的方式来储存人,因为一开始的时候是按顺序排列的。
那么一个一个压进栈的时候,如果连续的两个是夫妻那就出栈,如果不是,那就进栈。
这么一想。。这题目就这么简单。。。果然还是自己太水。。比较明显的这种裸题都看不出来。。。
另外不得不说一下..C语言可以直接使用stack,map,line,list等等...真是比pascal方便太多了.....
【代码】
#include <stdio.h>

#include <stack>

using namespace std;

int main()

{
int n;
int f[200100]={0};
while (~scanf("%d",&n)&& n!=0)
{
for (int i=0;i<n;i++)
{
int x,y;scanf("%d%d",&x,&y);
f[x]=i;f[y]=-i;
}
stack<int>a;
a.push(f[1]);
for (int i=2;i<=2*n;i++)
if (a.empty())
a.push(f[i]);
else
if (a.top()+f[i]==0) a.pop();
else a.push(f[i]);
if (a.empty()==0) printf("No\n");else printf("Yes\n");
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: