1289 大鱼吃小鱼(51nod)解题报告

版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_42373330/article/details/83115753

有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;
}

猜你喜欢

转载自blog.csdn.net/weixin_42373330/article/details/83115753
今日推荐