思路:(注意summ和sum1都是负数,所以不能减,要用+)
1.首先,通过输入获取一个整数n,表示苹果树的个数。
2.创建一个数组flag,用于标记每棵苹果树是否掉落了苹果。
3.进入一个循环,循环次数为n。在每次循环中,进行以下操作:
a. 获取一个整数m,表示当前苹果树上的苹果个数。接着创建一个数组temp,用于存储每个正数。
b. 遍历m次,将每个数存储在temp数组中,并进行相应的操作:
4.如果当前数小于等于0,表示需要进行疏果操作,累加到sum1变量中。
5.如果当前数大于0,表示该数为正数,将其存储在temp数组中,同时对计数器cnt加1,并在summ中累加sum1的值,最后将sum1重置为0。
c. 判断最后一个数是否大于0:
6.如果sum1等于0,表示最后一个数是正数或者一直是0,将最后一个正数加到总数T中。
7.如果sum1不等于0,表示输入的结尾类似为19 -1 -2 -3,那么最后剩余的数为temp[cnt]+sum1,将其加到总数T中。
d. 判断是否发生了自然掉落苹果的情况,如果temp[1]+summ不等于temp[cnt],表示自然掉落了苹果,将相应的标记flag[i]置为1。
8.然后,通过遍历1至n-2的树,统计掉落苹果的树的个数D和连续掉落苹果的树的个数E:
9.如果flag[i]等于1,表示第i棵树掉落了苹果,将D加1。
10.如果flag[i]等于1且flag[i+1]等于1且flag[i+2]等于1,表示第i、i+1、i+2棵树连续掉落苹果,将E加1。
11.补全D和E的计数,判断flag[n-1]和flag[n]是否为1,如果是,则将D加1;判断flag[n-1]、flag[n]和flag[1]是否为1,如果是,则将E加1。
12.最后,输出最后苹果总数T、掉落苹果的树的个数D和连续掉落苹果的树的个数E。
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=1005;
int flag[N];//标记是否掉苹果
//int sum1[N];//记录每个正数
int main(){
cin>>n;
int T=0;//最后苹果总数 ->T
for(int i=1;i<=n;i++){
int m;
cin>>m;
int tma;//即为aimi,也就是要输入的数
int temp[m+5];//记录每个正数
int cnt=1;//记录正数个数
int summ=0;//用来统计第一个正数和最后一个正数之间总共疏果个数
int sum1=0;//用来统计每一轮疏果个数(两个正数之间的负数和)
cin>>temp[1];
for(int i=2;i<=m;i++ ){
cin>>tma;
if(tma<=0){ //疏果操作
sum1+=tma;
}
else{ //统计数量(正数)
cnt++;
summ+=sum1;
sum1=0;
temp[cnt]=tma;
}
}
//可以将下面的cout取消注释,查看整个的运行逻辑
// cout<<"第一个正数和最后一个正数之间总共疏果个数:"<<summ<<endl;
// cout<<"最后一轮疏果数:"<<sum1<<endl;
// cout<<"开始的苹果数"<<temp[1]<<endl;
// cout<<"开始苹果数-最后一个正数之前总疏果数"<<temp[1]+summ<<endl;
// cout<<"最后一个正数是"<<temp[cnt]<<endl;
// cout<<"------------------------------------"<<endl;
if(sum1==0){ //表示最后一个输入的数是正数或者一直是0,那么最后剩的数就是最后一个正数
T+=temp[cnt];
}
else{ //表示输入的结尾类似为 19 -1 -2 -3,所以最后剩的数就是temp[cnt]-sum1;
T+=(temp[cnt]+sum1);
}
int iiii=1;//虚假程序,用来占位,不用管
if(temp[1]+summ!=temp[cnt]){//自然掉落了苹果
flag[i]=1;//表示i这棵树自然掉了苹果
}
}
int D=0;
int E=0;
for(int i=1;i<=n-2;i++){ //只遍历标号为1~n-2的树,那么D,E后面要正常补全
if(flag[i]==1){
D++;//统计掉落苹果的苹果树棵树
}
if(flag[i]==1&flag[i+1]==1&&flag[i+2]==1){
E++;
}
}
if(flag[n-1]==1){//补全D
D++;
}
if(flag[n]==1){
D++;
}
if(flag[n-1]==1&&flag[n]==1&&flag[1]==1){//补全E
E++;
}
if(flag[n]==1&&flag[1]==1&&flag[2]==1){
E++;
}
cout<<T<<" "<<D<<" "<<E;
cout<<endl;
// for(int i=1;i<=n;i++){
// if(flag[i]==1){
//
// cout<<"掉苹果的树是"<<i<<" ";
// } }
return 0;
}