解题思路:
利用一个(标记数组)来标记苹果是是否有掉落情况。特别需要强调的是:要考虑到同一个苹果树可能有多次掉落的情况,所以在标记的时候应该先判断一下这棵树有没有被标记,否则只能拿到50分,仅仅一个条件50分可见其重要性。
判断相邻连续三颗苹果树的掉落情况时可以考虑一下循环队列模除,但我觉得用一个for语句,再加上两种情况的判断比较容易一些。
下面是通过的满分代码:
#include <iostream>
#include <string.h>
using namespace std;
int Tree[1005];
int Drop[1005];
int main() {
int N,T=0,D=0,E=0;
cin>>N;
memset(Drop,0,sizeof(Drop[N])); //标记数组
int num=0,n=N; //num是Drop数组的下标,代表掉落的苹果树编号
while(n--)
{
int m;
cin>>m;
for(int i=0;i<m;i++)
cin>>Tree[i];
int before,t; //before用来记录每次记录之前的 旧苹果数量
t=Tree[0];
before=t;
for(int i=1;i<m;i++)
{
if(Tree[i]<=0)
{
t+=Tree[i];
before=t;
}
if(Tree[i]>0)
{
if(before>Tree[i]) //判断是不是同一颗苹果树发生的掉落情况
{
if(Drop[num]==0)
D++;
Drop[num]=1;
}
t=Tree[i];
}
}
T+=t;
num++;
}
//判断相邻连续三棵苹果树掉落情况
for(int i=1;i<N-1;i++)
{
if(Drop[i-1]&&Drop[i]&&Drop[i+1])
E++;
}
if(Drop[1]&&Drop[0]&&Drop[N-1])
E++;
if(Drop[0]&&Drop[N-2]&&Drop[N-1])
E++;
cout<<T<<" "<<D<<" "<<E<<endl;
return 0;
}