本题要注意树是围成一圈的,而我使用的是数组。判断连续三棵树时需要单独查看第1,2,N和第1,N-1,N的情况,例如假如有六棵树按如下方式排列。
1 2
6 3
5 4
通过循环只能判断123,234,345,456,而无法直接判断612,561.
for(int i=1;i<N-1;i++){
if(tree[i-1].combine!=0&&tree[i].combine!=0&&tree[i+1].combine!=0) //判断连续三棵树掉落苹果
E++;
}
因此我采用两个if语句单独判断这两种情况。
if(tree[0].combine!=0&&tree[1].combine!=0&&tree[N-1].combine!=0) E++; //一圈树,单独判断两种情况
if(tree[0].combine!=0&&tree[N-1].combine!=0&&tree[N-2].combine!=0) E++;
满分代码:
#include<iostream>
using namespace std;
struct node{
int num,ans[1000],sum,combine;
tree(){
combine=0;
}
}tree[1000];
int main(){
int N,m[1000],D=0,T=0,E=0;
cin>>N;
for(int i=0;i<N;i++){
cin>>m[i]>>tree[i].num; //记录操作次数和树上苹果数
for(int j=0;j<m[i]-1;j++){
cin>>tree[i].ans[j];
if(tree[i].ans[j]>0){
if(tree[i].ans[j]<tree[i].num){ //查看是否有苹果掉落
tree[i].combine++;
}
tree[i].num=tree[i].ans[j]; //重新记录后清空疏果数
}
else{
tree[i].num+=tree[i].ans[j]; //每次疏果后更新树上苹果数量
}
}
T+=tree[i].num; //苹果总数
}
for(int i=1;i<N-1;i++){
if(tree[i-1].combine!=0&&tree[i].combine!=0&&tree[i+1].combine!=0) //判断连续三棵树掉落苹果
E++;
}
if(tree[0].combine!=0&&tree[1].combine!=0&&tree[N-1].combine!=0) E++; //一圈树,单独判断两种情况
if(tree[0].combine!=0&&tree[N-1].combine!=0&&tree[N-2].combine!=0) E++;
for(int i=0;i<N;i++)
if(tree[i].combine!=0) D++; //判断有几棵树掉落苹果
cout<<T<<" "<<D<<" "<<E;
return 0;
}