1. 程式人生 > >51Nod 1289:大魚吃小魚

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\n",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\n",a[j]);
}