NYOJ 1396 可怜的农场主 栈

题目描述:

高富帅zzh先生在美丽的青藏高原上有一大片牧场,里面养殖着n只稀有的菜菜龙,他们的编号从1到n。因为zzh先生有强迫症,所以农场中有且只有可能存在偶数只菜菜龙。如果两只菜菜龙互相仇视,当它们相邻时,他们就会非常生气,然后,可爱的菜菜龙就去见上帝了(不要问我这是什么鬼?我也不知道啊!)。

这群菜菜龙在饲养员LJT的喂养下,每天都吃喝不愁,所以这群菜菜龙闲的经常为了一点小事就会发生矛盾,进而仇视对方,导致每只菜菜龙都有一个仇视的菜菜龙,或许因为菜菜龙脑袋比较小,他们只有可能仇视一只菜菜龙。(饶过可爱的菜菜龙吧,它们的小脑袋装不下太多…)在饲养员LJT喂食的时候,他们总是围成圈吃饭,它们会按照编号从1到n围成一圈,在他们围成圈吃饭时,如果两个互相仇视的菜菜龙相邻,两只菜菜龙都会因看到对方而生气导致死亡,LJT会将死亡的菜菜龙扔出牧场,剩余的菜菜龙会再次按照编号围成一个圈,请问到最后牧场中死亡多少只菜菜龙?

输入描述:

多组输入
每组第一行输入一个整数n(0<n<1000);表示牧场中有n组互相仇视的菜菜龙,
接下来的n行,每行有两个整数a,b(0<b,a<=2n);代表一组互相仇视的菜菜龙a和菜菜龙b。

输出描述:

输出死亡的菜菜龙数量。
每个答案占一行。

样例输入:

复制

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

样例输出:

8
0

提示:

来源:

ACM—刘俊涛

数组模拟

#include<stdio.h>
#include<queue>
#include<stack>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int s[2001];
int ss[2001];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)
            return 0;
        for(int i=1; i<=n; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            s[a]=-i;//将两只菜菜龙联系起来
            s[b]=i;
        }
        int l=1,r=2*n;
        int sum=0;
        int u=0;
        while(s[l]+s[r]==0)//判断首尾是否仇视
        {   sum+=2;
            if(l==n)//到n结束
            {
                u=1;
                break;
            }
            l++;
            r--;
        }
        if(u==1)
        {
            printf("%d\n",sum);
            continue;
        }
        int k=-1;
        for(int i=l; i<=r; i++)
        {
            if(k==-1)
            {
                ss[++k]=i;
            }
            else
            {
                if(s[ss[k]]+s[i]==0)
                {
                    k--;
                    sum+=2;
                }
                else
                    ss[++k]=i;
            }
        }
        printf("%d\n",sum);
    }
    return 0;
}

栈:

#include<stdio.h>
#include<queue>
#include<stack>
#include<vector>
#include<string.h>
#include<algorithm>
using namespace std;
int s[3000];
stack<int>q;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0)
            return 0;
        while(!q.empty())
            q.pop();
        for(int i=1; i<=n; i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            s[a]=-i;
            s[b]=i;
        }
        int l=1,r=2*n;
        int sum=0;
        int u=0;
        while(s[l]+s[r]==0)
        {   sum+=2;
            if(l==n)
            {
                u=1;
                break;
            }
            l++;
            r--;
        }
        if(u==1)
        {
            printf("%d\n",sum);
            continue;
        }
        for(int i=l; i<=r; i++)
        {
            if(q.empty())
            {
                //printf("%d*\n",i);
                q.push(i);
            }
            else
            {
                if(s[q.top()]+s[i]==0)
                {
                    q.pop();
                    sum+=2;
                }
                else
                    q.push(i);
            }

        }
        printf("%d\n",sum);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Kuguotao/article/details/84064539