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
 Copy sample input to clipboard
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>
#include <vector>

using namespace std;

int main()
{

int n;         //共有几对夫妻
while(cin>>n){   //读取每组测试数据中夫妻的对数
if(n==0) return 0;  //读到0测试数据结束
int a,b;           //接受数据
vector<int> cou;    //接受夫妻数据向量,其中向量下标为夫妻的序号减一
stack<int> cirl;   //用栈来验证是否都符合要求
vector<int>::iterator it;
for(int z=0;z<n*2;z++) //初始化向量
{
cou.push_back(z);
}

for(int x=0;x<n;x++)  //读取每对夫妻
{
cin>>a>>b;        
a=a-1;
b=b-1;
cou[a]=x;       //每对夫妻在向量中的数值相同
cou[b]=x;
}

for(it=cou.begin();it!=cou.end();it++)
{
if(!cirl.empty())
{
if(cirl.top()==(*it))  //数值相同,为夫妻,栈顶数据移除
{
cirl.pop();       
}
else cirl.push(*it);   //如果不相同,则入栈,查找下一个
}
else cirl.push(*it); 
}
if(!cirl.empty())           //栈为空则符合题目要求
cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
三对夫妻过河问题是一个经典的动态规划问题,通常用来教授基本的递归算法和状态转移方程。在MATLAB中,我们可以使用二维数组(矩阵)来模拟这个问题。以下是简化的MATLAB建模步骤: 1. 定义状态变量:我们需要定义一个矩阵,其中每个元素代表一个状态,例如`A[i,j]`表示第i对夫妻到达对岸的情况,`i`从1到3,`j`从0到2,表示三种船的组合(无船、一条船或两条船)。 2. 初始化状态:初始状态下,所有人都在河的一边,所以`A[1,0] = A[2,0] = A[3,0] = 1`(表示他们已经到达),其他位置为0。 3. 状态转移:对于每一对夫妻,我们检查所有可能的船组合。比如,如果第一对夫妻用了一条船,那么第二对夫妻有三种选择:单独用另一条船、和第一对一起,或者留在原地。根据这些情况,更新矩阵中的值。 ```matlab function result =夫妻过河(A, couples) nCouples = length(couples); for wifeIndex = 1:nCouples husbandIndex = couples(wifeIndex); % 第一对夫妻过河的所有可能性 for boat1 = 0:2 if boat1 == 2 && wifeIndex > 1 % 如果是第三对夫妻且只有一条船,无法同时过河 continue; end % 更新船上的人数 船上人数 = max(boat1 - 1, 0) + 1; % 船上可能有的其他夫妻数量 % 计算剩余夫妻的过河方式 remainingWives = setdiff([1:nCouples], [wifeIndex, husbandIndex]); boat2 = findRemainingBoat(A, remainingWives, husbandIndex,船上人数); % 更新状态 A(wifeIndex+1, boat1+boat2) = A(wifeIndex+1, boat1+boat2) + 1; end end % 最终结果是到达对岸的最小步数 result = min(A(:,2)); end % 辅助函数,找出剩余夫妻过河所需的最小船只数量 function boat2 = findRemainingBoat(A, remainingWives, husbandIndex,船上人数) for boat2 = 0:2 if boat2 == 2 && remainingWives > 1 continue; % 如果只剩最后一对,但没有多余的船,无法同时过河 end if sum(A(remainingWives, boat2)) >=船上人数 return boat2; % 找到足够承载剩余夫妻的船 end end end ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值