• CSP 小明种苹果(续)201909-2


    输入:

    4

    4 74 -7 -12 -5

    5 73 -8 -6 59 -4

    5 76 -5 -10 60 -2

    5 80 -6 -15 59 0

    输出:

    222 1 0

    输入:

    5

     4 10 0 9 0

    4 10 -2 7 0

    2 10 0

    4 10 -3 5 0

    4 10 -1 8 0

    输出:

    39 4 2

    注意:

    1.发生苹果掉落和疏果是两种不同的操作 发生苹果掉落(5 3) 疏果(5 -3)

    2.一棵树可能出现多次苹果掉落的情况 比如:3 5 2 1(对于一棵树来说 有3个操作,原来有5个苹果,第一次掉落后还剩2个,第二次掉落后还剩1个)

    3.当发生苹果掉落的苹果树的棵树大于等于3时才可能形成连续的三个苹果树

    发生苹果掉落的苹果树的序号我是用栈存的,感觉稍微麻烦了点,有时间试试数组

    #include <cstdio>
    #include <algorithm>
    #include <iostream>
    #include <stack>
    #include <cstring>
    #define mem(a,b) memset(a,b,sizeof(a))
    
    using namespace std;
    typedef long long LL;
    const int mod = 1e9+7;
    int dir[4][2] = {0,1,0,-1,1,0,-1,0};
    stack<int>q;
     int main()
    {
        LL n;
        LL T = 0,D = 0,E = 0;
        cin >> n;
        int first = 0,second = 0;
        for(int i = 1; i <= n; i++) {
            int k;
            cin >> k;
            LL res1 = 0,kk;
            for(int j = 1; j <= k; j++) {
                cin >> kk;
                if(j == 1) {
                    res1 = kk;
                } else {
                    if(kk > 0) {
                        if(kk != res1)
                           {
                               if(q.size() == 0) {
                                   q.push(i);
                                   first = i;
                                   D++;//在内部统计D 防止一个序号的苹果树被多次统计
                                  // cout << i << endl;
                               } else if(q.size() == 1) {
                                   int temp = q.top();
                                   if(i != temp)
                                   {
                                       q.push(i);
                                       second = i;
                                       D++;//如果该苹果树没有在栈中出现过D++
                                      // cout << i << endl;
                                   }
                               }
                               else {
                                   int temp = q.top();
                                   if(i != temp)
                                   {
                                       q.push(i);
                                       D++;
                                      // cout << i << endl;
                                   }
                               }
                           }
                         res1 = kk;
                    } else {
                        res1 -= -kk;
                    }
                }
            }
            T += res1;
        }
        if(q.size() >= 3){//当发生苹果掉落的苹果树棵树大于等于3时才有可能出现连续的三个苹果树
        while(!q.empty()){
            int temp = q.top();
            q.pop();
            //苹果树序号连续的三种情况
            if((temp+1 == first && first+1 == second) || ((temp == n) && (first == 1) && (second == 2)) || ((temp == n-1) && (first == n) && (second = 1))) {
                E++;
            }
            second = first;
            first = temp;
        }
        }
        cout << T << " " << D << " " << E << endl;
        return 0;
    }
  • 相关阅读:
    什么是被 GC Roots 直接引用的对象?
    什么情况下JVM内存中的一个对象会被垃圾回收?
    图解GC流程
    图解JVM内存区域划分
    图解JVM类加载机制和双亲委派模型
    Nginx 是怎么工作的?
    ThreadLocal 线程本地存储
    centos7 配置阿里镜像
    C# 类库项目 无法创建 “资源字典” 文件
    linux 启动jar包 指定yml配置文件和输入日志文件
  • 原文地址:https://www.cnblogs.com/LLLAIH/p/11634639.html
Copyright © 2020-2023  润新知