zoukankan      html  css  js  c++  java
  • [51nod] 1289 大鱼吃小鱼 堆栈-模拟

    有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

    可视为向右的鱼是静止的,他们的命运是由后面向左走的鱼决定的,同时后面向左走的鱼的命运也有静止的鱼决定(可能把静止的全吃掉,也可能自己被某一个吃掉)
    可以把静止的鱼放到堆栈里,对向左走的鱼的命运进行判断 在堆栈中一直走,遇到比他大的game over(╥_╥) 全吃掉就win了๑乛◡乛๑
    #include <iostream>
    #include <stdio.h>
    #include <stack>
    using namespace std;
    
    int main()
    {
        stack<int> S;
        int N;
        scanf("%d", &N);
        int ans = N;
        while (N--) {
            int Size, D;
            scanf("%d%d", &Size, &D);
            if (D == 1)
                S.push(Size);
            else {
                while (!S.empty()) {
                    if (Size > S.top()) {
                        S.pop();
                        ans--;
                    }
                    else {
                        ans --;
                        break;
                    }
                }
            }
        }
        printf("%d", ans);
    
        return 0;
    }
     
  • 相关阅读:
    最长连续子序列(dp,分而治之递归)
    判断线段是否相交
    1840: Jack Straws
    5065: 最长连续子序列
    TZOJ 4493: Remove Digits
    TZOJ 5271: 质因数的个数
    2019年天梯赛
    PTA 树的遍历
    TZOJ:3660: 家庭关系
    PTA 复数四则运算
  • 原文地址:https://www.cnblogs.com/whileskies/p/7083431.html
Copyright © 2011-2022 走看看