大魚小魚問題——遊啊遊(棧)

韓小妹發表於2018-08-08

有N條魚每條魚的位置及大小均不同,他們沿著X軸遊動,有的向左,有的向右。遊動的速度是一樣的,兩條魚相遇大魚會吃掉小魚。從左到右給出每條魚的大小和遊動的方向(0表示向左,1表示向右)。問足夠長的時間之後,能剩下多少條魚?

Input

第1行:1個數N,表示魚的數量(1 <= N <= 100000)。 
第2 - N + 1行:每行兩個數Aii, Bii,中間用空格分隔,分別表示魚的大小及遊動的方向(1 <= Aii <= 10^9,Bii= 0 或 1,0表示向左,1表示向右)。

Output

輸出1個數,表示最終剩下的魚的數量。

Sample Input

5
4 0
3 1
2 0
1 0
5 0

Sample Output

2

/**************************************************************************************
*用陣列a來模擬棧,棧中儲存向右邊遊動的魚,cnt和len分別儲存向左和向右的存活下來的魚 
*1.如果來的魚向右遊動,直接入棧 
*2.如果此時棧為空,來了一條向左遊動的魚,這條魚可以存活,cnt++;
*3.如果此時棧未空,來了一條向左遊動的魚,則開始吃魚, 
*  直到遇見一條比它大的魚或棧空,同時棧進行出棧操作; 
***************************************************************************************/ 

AC碼:

#include<stdio.h>
int a[100010];
int main()
{
	int n;
	scanf("%d",&n);//共n條魚 
	int z0=0;//左0存活 
	int y1=0;//右1存活 
	int da,fa;//大小 方向 
	for(int i=0;i<n;i++)
	{
		scanf("%d %d",&da,&fa);
		if(fa==1)
		{//向右遊的存入陣列a[]中 
			a[++y1]=da;
		}
		else
		{
			if(y1==0)
			z0++;
			else
			{
				for(y1;y1>0;y1--)
				{
					if(a[y1]>da)
					break;
				}
				if(y1==0)
				z0++;
			}
		}
	}
	printf("%d\n",z0+y1);
	return 0;
 } 

 

相關文章