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

时间:2021-03-26 18:34:25

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

 

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