51nod大魚喫小魚問題

有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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章