题目描述:
高富帅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
提示:
来源:
数组模拟
#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;
}