/*
定义输入N 二维数组
输出T总数 D掉落棵树 E掉落组数
定义last记录上次掉落的编号,flag=1表示两次连续掉落,不掉落归零
spec=1表示1 2都掉落了,spec=2表示只有1掉落
对每个i用for迭代,最后一个正数为T分量
将每行第二个数,与所有负数求和与最后一位正数比较,得出D分量
定义cut为疏果操作,drop为掉果
*/
#include <stdio.h>
static int arr[1000][1001]; //设置为静态防止溢出
int main()
{
int N,T=0,D=0,E=0;
int last=-2,flag=0,spec=0;
int i,j;
scanf("%d",&N);
for(i=0;i < N;i++)
{
int drop=0,cut=0,t=0;
scanf("%d",&arr[i][0]);
for(j=1;j <= arr[i][0];j++)
{
scanf("%d",&arr[i][j]);
}
for(j=2;j <= arr[i][0];j++)
{
if(arr[i][j]<0)
cut+=arr[i][j];
if(arr[i][j]>0)
{
t = arr[i][j];
drop = arr[i][1]+cut-t;
}
}
T+=arr[i][1] - drop + cut;
if(drop > 0)
{
D++;
if(last==0 && i==1)
spec = 1;
else if(i==0)
spec = 2;
if(i == N-1 && last == N-2 && spec != 0)
E++;
if(flag == 1)
E++;
if(i == N-1 && spec == 1)
E++;
if(i-last==1)
flag = 1;
last = i;
}
else
flag = 0;
}
printf("%d %d %d",T,D,E);
return 0;
}
通过测试