1. 程式人生 > >1289 大魚吃小魚(51nod)解題報告

1289 大魚吃小魚(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

這個簡單模擬題 寫得有點久啊,太蒻了

/*
1289

*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
#define ll long long
const int N=1e5+10;
double len[N];
int vis[N];
double edg[N];
int main()
{
    int n;
    scanf("%d",&n);
    memset(edg,0,sizeof(edg));//裡面存的是魚的長度
    for(int i=0;i<n;i++)
    {
        scanf("%lf %d",&len[i],&vis[i]);
    }
    int ans=0;//計算被吃的魚
    int id=0;
    for(int i=0;i<n;i++)
    {
        if(vis[i])//將vis是1的放入edg陣列中
        {
            edg[++id]=len[i];
        }

        if(id>0&&vis[i]==0) //所有的吃與被吃的操作都在這裡面
        {
            /*
            if(len[i]>edg[id]) //右吃左 haiyaojixu
            {
                ans++;
                edg[id]=len[i];
            }
            */
            //下面只是對edg裡的魚,和len[i]的的操作,且edg放的都是向右的魚
            //情況1 往左的魚一進來就被吃 --下面的if語句
            //2 往左的魚沒有把向右的魚全吃掉--執行while後,edg[id]所代表的魚就是吃掉len[i]的魚,但while中沒有計算len[i],
                //  故在if中將ans++;
            //3 往左的魚所有的向右的魚吃掉-- 執行while後,id=0,不會執行if(len[i]<edg[id)這部分
            while(len[i]>edg[id]&&id>0)
            {
                edg[id]=0;
                ans++;
                id--;
            }
            if(len[i]<edg[id]) //左吃右,進入下一個for
            {
                ans++;
                continue;
            }
        }
    }
    printf("%d\n",n-ans);


    return 0;
}