zcmu-1273 夫妻

【题述】

Description

有n对夫妻围成一个圈站,他们每个人被连续的编号为1至2n。丈夫和妻子不一定站在一起。现在,对于一对夫妻,如果他们两人中间没有隔任何其他人(站在一起),那么,他们将牵手离开。直到所有人都离开或者留下的人不能成功牵手,游戏结束。

现在请问:是否所有的夫妻都能成功牵手走出这个圆圈呢?

Input

输入包含多组测试数据。每组测试数据中,第一行为一个整数n(1<=n<=100000),表示有n对夫妻。之后的n行中,每行包含两个整数a和b,表示a与b是一对夫妻,他们初始时站的位置为a和b。

n=0表示程序终止输入。

Output

如果所有的夫妻都能成功牵手离开,输出“Yes”,否则,输出“No”。

Sample Input

4 1 4 2 3 5 6 7 8 2 1 3 2 4 0

Sample Output

Yes No

扫描二维码关注公众号,回复: 2417923 查看本文章

思路:

    使用栈,读取,相邻两个栈是夫妻的离开(push),直到栈空(YES),无法栈空的话(NO).ab代表夫妻的位置 ,i循环n次,给每一对夫妻附上同一个值i,用判断每个栈的i的值是否一样来判断他们是否是夫妻。

【我的代码(通过代码)】

#include <cstdio>

#include <cstring>

#include <stack>

using namespace std;

const int maxn=200000+10;

int arr[maxn];

stack<int> s;

int main(){

    int i,a,b,n,j;

    while(scanf("%d",&n)!=EOF){

        memset(arr,0,sizeof(arr));

        if(n==0)break;

        for(i=0;i<n;i++){

            scanf("%d%d",&a,&b);

            arr[a]=i;

            arr[b]=i;//这里注意a,b的值>=1,<=n;

        }

        s.push(arr[1]);//先丢一个进去;

        for(j=2;j<=n*2;j++){//这里注意n表示几对夫妻,总人数是2n

            if(s.empty())

                s.push(arr[j]);//如果栈空了,就在丢一个进去

            else{

                if(s.top()==arr[j])

                    s.pop();//进来的这个与已经在栈里的栈顶元素(就是前一个进来的,在栈顶)比较,如果确认他们是夫妻,就把它们丢出去

                else

                    s.push(arr[j]);//他们不是夫妻,就把刚刚读取也丢进来

            }

        }

        if(!s.empty())

            printf("No\n");

        else

            printf("Yes\n");

    }

    return 0;

}

猜你喜欢

转载自blog.csdn.net/hzyhfxt/article/details/81188437