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
41 4
2 3
5 6
7 8
2
1 3
2 4
0
Sample Output
YesNo
这道题目我一开始的时候不知道做...放了很久才做的..
乍一看以为这道题类似于约瑟夫的模拟,但是考虑到多组数据并且数据较大..一定会超时,所以一开始想不通怎么做。
后来又觉得这道题是在找交叉状态,也就是比如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");
}
}
相关文章推荐
- POJ1273 Drainage Ditches(网络流&增广路)
- poj1273 Drainage Ditches
- http://poj.org/problem?id=1273
- POJ 1273 Drainage Ditches
- HDU 1273 漫步森林
- HDOJ---1273 漫步森林[图论]
- poj 1273 Drainage Ditches(网络流基础)
- 【代码系列】POJ 1273( 单纯形解最大流 )
- POJ1273(Drainage Ditches)
- POJ 1273
- POJ 1273 || HDU 1532 Drainage Ditches (最大流模型)
- poj 1273 Drainage Ditches_最大流模版
- POJ 1273 Drainage Ditches 最大流
- hdu 1273最大流
- poj 1273 最大流(Ford-Fulkerson算法和Dinic算法分别实现)
- poj1273最大流dinc
- POJ 1273Drainage Ditches --网络流最大流模板题
- NOJ [1273] So Long the String
- POJ 1273 (基础最大流) Drainage Ditches
- poj 1273 Drainage Ditches