天天看点

ZCMU—1273

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");
}
 }      
下一篇: ZCMU—1231