51Nod 1289:大鱼吃小鱼(模拟, 栈)

https://www.51nod.com/Challenge/Problem.html#!#problemId=1289

有N条鱼每条鱼的位置及大小均不同,他们沿着X轴游动,有的向左,有的向右。游动的速度是一样的,两条鱼相遇大鱼会吃掉小鱼。从左到右给出每条鱼的大小和游动的方向(0表示向左,1表示向右)。问足够长的时间之后,能剩下多少条鱼?

输入

第1行:1个数N,表示鱼的数量(1 <= N <= 100000)。
第2 - N + 1行:每行两个数A[i], B[i],中间用空格分隔,分别表示鱼的大小及游动的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。

输出

输出1个数,表示最终剩下的鱼的数量。

输入样例

5
4 0
3 1
2 0
1 0
5 0

输出样例

2

如果鱼的头是向右的就把鱼入栈,如果鱼头向左,就让它向左走吃鱼直到被吃或者走的尽头。

#include<stdio.h>
#define N 100020
int a[N];
int main()
{
	int n,i,len,j,sum,temp,s;
	scanf("%d",&n);
	len=1;
	sum=0;
	while(n--)
	{
		scanf("%d%d",&s,&temp);
		if(temp==1)
		{
			a[len]=s;
			len++;
		}
		
		else
		{	
			if(len==1)
				sum++;
			else
			{
				for(i=len-1;i>=1;i--)
					if(a[i]>=s)
						break;
					
				len=i+1;	
				if(len==1)
					sum++;	
			}
		}
	}
	printf("%d
",sum+len-1);
        return 0;
} 

一道相似的题目:

2160:数字游戏

现在有n个数字依次进入一个栈,每个数字a进入栈的时候,如果栈顶元素小于a,则会将栈顶元素弹出,新的栈顶元素如果仍然小于a,则会将新的栈顶元素继续弹出,直到栈顶元素大于等于a为止,a才会加入栈。问n个数字依次进入后,最后栈里的数字依次是?

输入

输入第一行一个整数n(n<=100000),表示有n个数字依次进入栈。
接下来n行,每行一个整数,表示第i个数字。

输出

若干行,表示最后栈中的数字。

输入样例

5
5
3
2 
4
1

输出样例

5
4
1
#include<stdio.h>
#define N 100020
int a[N];
int main()
{
	int n,i,j,num;
	scanf("%d",&n);
	i=1;
	n--;
	scanf("%d",&a[1]);
	while(n--)
	{
		scanf("%d",&num);
		for(j=i;j>=1;j--)
		{
			if(a[j]>=num)
			{
				a[j+1]=num;	
				break;
			}		
		} 
		if(j==0)
			a[1]=num;
		i=j+1;
	}
	for(j=1;j<=i;j++)
		printf("%d
",a[j]);
} 
原文地址:https://www.cnblogs.com/zyq1758043090/p/11852860.html