51NOD 大魚喫小魚

題目來源: Codility
基準時間限制:1 秒 空間限制:131072 KB 分值: 5 難度:1級算法題
 收藏
 關注
有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

題解:從最左邊的魚開始循環當遇到向右遊的魚就入棧。遇到向左遊的魚且有向右遊的魚就比較。左遊的魚大就出棧魚總數減一,右遊的大就結束此次比較且魚總數減一

#include<bits/stdc++.h>
using namespace std;
 #define M 100005

long n;
struct node{
    long body,diretion;
}a[M];

stack <int > st1;

int main()
{
    cin>>n;
    long ans=n;
    for(long i=0; i<n; i++)
        cin>>a[i].body>>a[i].diretion;
    for(long i=0; i<n; i++){//從最左邊的魚開始
        if(a[i].diretion==1){//遇到向右遊的魚就如棧
            st1.push(a[i].body);
        }
        if(a[i].diretion!=1&&!st1.empty()){//遇到向左遊的魚且有向右遊的魚就比較
            while(!st1.empty()){
                if(a[i].body>st1.top())
                {
                    st1.pop();
                    ans--;
                }
                else{
                    ans--;
                    break;
                }
            }
        }
    }
    cout<<ans;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章