Sicily 1021. Couples

这道题目的大意是,输入N对夫妇,这N对夫妇按顺序站成一个圈,然后在圈中夫妇如果相邻的话便可以去除掉,直到最后所有的夫妇都可以去除掉则输出Yes,否则输出No。

例如:输入4对夫妇为

1 4
2 3
5 6
7 8
将这4对夫妇按顺序站好为1 2 3 4 5 6 7 8,其中1与8也相邻,因为这是一个圈,不过在内存中存储的时候就可以只用一个数组来表示这4对夫妇。可以把夫妇对应的位置设置为相同的数字,将数组变为1 2 2 1 3 3 4 4,然后题目就可以简化为删除掉这个数组中相邻且相同的数字了。

#include "iostream"
using namespace std;
#define N 100000
int couple[2*N];
int main()
{
	int n;  //夫妻数量
	while (cin>>n && n !=0)
	{
		/*for (int i = 0; i < 2 * n; i++)
		{
			couple[i] = i + 1;   //给数组赋初值
		}*/
		for (int j = 0; j < n; j++) //分别输入n对夫妻
		{
			int a, b;  //定义要输入的一对夫妻
			cin>>a;
			cin>>b;
			couple[a-1] = j; //把a、b的对应位置设置为一样的
			couple[b-1] = j;
		}

		int top = 0;      //定义一个首指针和一个尾指针
		int rear = 2 * n - 1;
		bool flag = false; //设置结束标记默认false
		while (1)
		{
			if (rear == top + 1) //结束标识,数组要还剩最后一组,肯定为一对
			{
				flag = true;
				break;
			}
			else if (couple[rear] == couple[rear - 1]) //最后两个数相同
			{
				rear -= 2;//最后两个数出数组
			}
			else if (couple[rear] == couple[top]) //首尾相同
			{
				top++; //首出列
				rear--;//尾出列
			}
			else
				break;
		}
		if(flag)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
		
	}

	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值