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

匿名 (未验证) 提交于 2019-12-03 00:13:02

 

 

 

 

 

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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!