Sicily 1021 Couples

1021. Couples

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

一. 题意理解
N 对夫妻站成一个圈,按顺序编号为 1~2N,如果有夫妻相邻,就消掉他们。夫妻关系在输入中体现。比如:
在这里插入图片描述
上图中,如果1和4是夫妻,2和3是夫妻,5和10是夫妻,6和7是夫妻,8和9是夫妻,那么就可以消除所有的夫妻。
如果只有2对夫妻,标号1、2、3、4,1和3是夫妻,2和4是夫妻(即上面的输入),那么就无法消除。

二. 解题思路
类似括号匹配问题。我们需要一个数组和一个栈。数组用来存夫妻关系。从编号为 1 的人开始,下一个人若与前一个人是夫妻关系,则 pop 栈顶的元素;反之,入栈。

三. 代码实现

#include<iostream>
#include<stack>
using namespace std;
int arr[200002];

int main() {
	int n;
	while (cin>>n,n!=0) {
			stack<int> s;
			for (int i = 0; i < n; i++) {
				int t1, t2;
				cin >> t1 >> t2;
				arr[t1] = t2;
				arr[t2] = t1;  //存储夫妻关系
			}
			for (int i = 1; i <= 2 * n; i++) {
				if (!s.empty() && arr[i] == s.top()) s.pop(); 
				else s.push(i);
			}
			if (s.empty()) {
				cout << "Yes" << endl;
			}
			else cout << "No" << endl;
	}
	return 0;
}

四.实验总结与心得:
本题考查栈的使用,类似于括号匹配问题。要弄清楚入栈出栈的顺序以及元素间的匹配关系。存夫妻关系的时候需要注意,要做到双向联系。时间复杂度分析:O(n)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值