1396-可怜的农场主
- 内存限制:32MB 时间限制:1000ms
题目描述:
高富帅zzh先生在美丽的青藏高原上有一大片牧场,里面养殖着n只稀有的菜菜龙,他们的编号从1到n。因为zzh先生有强迫症,所以农场中有且只有可能存在偶数只菜菜龙。如果两只菜菜龙互相仇视,当它们相邻时,他们就会非常生气,然后,可爱的菜菜龙就去见上帝了(不要问我这是什么鬼?我也不知道啊!)。
这群菜菜龙在饲养员LJT的喂养下,每天都吃喝不愁,所以这群菜菜龙闲的经常为了一点小事就会发生矛盾,进而仇视对方,导致每只菜菜龙都有一个仇视的菜菜龙,或许因为菜菜龙脑袋比较小,他们只有可能仇视一只菜菜龙。(饶过可爱的菜菜龙吧,它们的小脑袋装不下太多…)在饲养员LJT喂食的时候,他们总是围成圈吃饭,它们会按照编号从1到n围成一圈,在他们围成圈吃饭时,如果两个互相仇视的菜菜龙相邻,两只菜菜龙都会因看到对方而生气导致死亡,LJT会将死亡的菜菜龙扔出牧场,剩余的菜菜龙会再次按照编号围成一个圈,请问到最后牧场中死亡多少只菜菜龙?
输入描述:
多组输入 如果n为0,程序结束。 每组第一行输入一个整数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
提示: 意思就是一群人围一圈,有仇的两个人不能够挨着,否则两人出局,别的人重新分配身边的人,
1、判断首尾是否有关系
2、完成步骤1后,利用栈,类似括号配对,按照顺序进栈,如果栈顶元素和下一个元素有关系,栈顶元素出栈,直到剩下的所有元素验证完,
#include<iostream>
#include<cstring>
#include<stack>
#include<cstdio>
using namespace std;
int main()
{
int n;
stack<int>s;
while(~scanf("%d",&n)&&n!=0)
{
//cout<<"231"<<endl;
int sum=0;
int sk[10001];
int i,begin,end,m,a,b,flag=0;
m=2*n;
for(i=1;i<=m;i++)sk[i]=i; //初始化
for(i=1;i<=n;i++) //关系
{
cin>>a>>b;
//printf("%d\n",m);
sk[a]=i;
sk[b]=-i;
}
begin=1;end=m;
while(sk[begin]+sk[end]==0)
{
sum=sum+2;
if(begin==n)
{
flag=1;
break;
}
begin=begin+1;
end=end-1;
}
if(flag==1)
{
printf("%d\n",sum);
continue;
}
for(i=begin;i<=end;i++)
{
if(s.empty())
{
s.push(sk[i]);
}
else
{
if(s.top()+sk[i]==0)
{
s.pop();
sum=sum+2;
}
else
{
s.push(sk[i]);
}
}
}
printf("%d\n",sum);
while(!s.empty())
{
s.pop();
}
}
}