Constraints
Time Limit: 1 secs, Memory Limit: 32 MB
Description
N couples are standing in a circle, numbered consecutively clockwise from 1 to 2N. Husband and wife do not always stand together. We remove the couples who stand together until the circle is empty or we can't remove a couple any more.
Can we remove all the couples out of the circle?
Input
There may be several test cases in the input file. In each case, the first line is an integer N(1 <= N <= 100000)----the number of couples. In the following N lines, each line contains two integers ---- the numbers of each couple.
N = 0 indicates the end of the input.
Output
Output "Yes" if we can remove all the couples out of the circle. Otherwise, output "No".
Sample Input
4 1 4 2 3 5 6 7 8 2 1 3 2 4 0
Sample Output
Yes No
Problem Source
ZSUACM Team Member
参考了别人的思路,很巧妙。
思路:巧妙的使用了栈结果。
先将每对夫妇用一个数组映射起来。然后从循环数组的第一个开始扫,如果这个人和栈顶是夫妇则出栈,如果不是则入栈。当循环数组扫描完后栈是空的说明满足要求,否则不满足。
代码如下:
#include <stack>
#include <iostream>
using namespace std;
const int maxn = 100010 * 2;
int couples[maxn];
int main()
{
int t;
while (cin >> t&&t)
{
int a, b;
stack<int> sta;
for (int i = 0; i < t; ++i)
{
cin >> a >> b;
couples[a] = b;
couples[b] = a;
}
for (int i = 1; i <= 2 * t; ++i)
{
if (!sta.empty() && sta.top() == couples[i])
sta.pop();
else
sta.push(i);
}
if (sta.empty())
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}