有N條魚每條魚的位置及大小均不同,他們沿着X軸遊動,有的向左,有的向右。遊動的速度是一樣的,兩條魚相遇大魚會喫掉小魚。從左到右給出每條魚的大小和遊動的方向(0表示向左,1表示向右)。問足夠長的時間之後,能剩下多少條魚?
Input
第1行:1個數N,表示魚的數量(1 <= N <= 100000)。
第2 - N + 1行:每行兩個數A[i], B[i],中間用空格分隔,分別表示魚的大小及遊動的方向(1 <= A[i] <= 10^9,B[i] = 0 或 1,0表示向左,1表示向右)。
Output
輸出1個數,表示最終剩下的魚的數量。
Input示例
5
4 0
3 1
2 0
1 0
5 0
Output示例
2
思路:模擬棧的操作,在棧爲空的情況下,向左的魚不做記錄,向右的魚記錄,再次遇到向左的則喫,直到棧空或被喫。
爲什麼要記錄向右的魚?
分兩種情況:
(1)記錄向左的魚,這時會發現,若之前的魚向右而又沒有記錄,此時一個向左一個向右是相向而行的,不能進行比較,因此不能記錄向左的魚。
(2)記錄向右的魚,這時就算之前有相鄰向左的魚沒有記錄,由於一個向左一個向右相背而行也是不會相遇的,因此記錄向右的魚。
注意點:定義數組時一定要注意題目中的範圍,不然會出現Runtime error 這種錯誤。
代碼:
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main()
{
long long a[100002];
int b[100002];
long long c[100002];
int n,i;
int top=-1;
cin>>n;
int m=n;
for(i=0;i<n;i++)
cin>>a[i]>>b[i];
for(i=0;i<n;i++)
{
if(b[i]==1)
{
top++;
c[top]=a[i];
}
else
{
while(top!=-1)//當棧不空時
{
if(a[i]>c[top])
{
m--;
top--;
}
else
{
m--;
break;
}
}
}
}
cout<<m<<endl;
}