题目分析:读这个第二题比以往第二题要更细心,中间涉及的各种量有点多,但题目说得很明确,最后要给出三个答案,就分开算呗,计算步骤还是挺简单的。
题目难点:既要统计发生掉落的苹果棵树,又要统计连续三棵果树掉落的情况的次数。因为题目规定将所有果树围成一个圈,所以第二种情况要好好想想该怎么处理。
C++满分代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=1000;
int tree[N+2][N+2],b[N+2];
bool dtree[N+2];
int main()
{
int n,m,hans=0,dans=0,first=0,sum=0,i,j; //倘若不会统计第二个和第三个问题,要把hans和dans都置为0
cin>>n;
memset(dtree,true,n+5);
for(i=0;i<n;i++){
cin>>b[i];
for(j=1;j<=b[i];j++)
cin>>tree[i][j];
}
for(i=0;i<n;i++){
first=tree[i][1];
for(j=2;j<=b[i];j++){
if(tree[i][j]<=0) first+=tree[i][j];
else{
if(tree[i][j]!=first) {
first=tree[i][j];
dtree[i+1]=false;
}
}
}
sum+=first;
}
//统计发生掉落的棵树
for(i=1;i<=n;i++)
if(!dtree[i]) dans++;
//统计连续三棵果树都发生掉落的次数
for(i=1;i<=n;i++){
if(!dtree[i]&&!dtree[i+1]&&!dtree[i+2]) hans++;
if(i+2>=n) break;
}
if(!dtree[1]&&!dtree[2]&&!dtree[n]) hans++;
if(!dtree[n]&&!dtree[n-1]&&!dtree[1]) hans++;
cout<<sum<<" "<<dans<<" "<<hans;
return 0;
}
----------------------------------------------无情的分割线-----------------------------------------
自我反省:以后写题能少开数组就少开数组
储存优化后的代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=1005;
bool dtree[N];
int main()
{
int n,sum=0,D=0,E=0;
cin>>n;
memset(dtree,true,n+5);
for(int i=0;i<n;i++){
int m,fsum=0,flag=1;//flag用来确保掉落果子的树只被记录一次
cin>>m;
for(int j=0;j<m;j++)
{
int t;
cin>>t;
if(!j) {
fsum=t;
continue;
}
if(t>0){
if(t!=fsum){
fsum=t;
if(flag){
dtree[i]=false;
++D;
flag=0;
}
continue;
}
}
if(t<=0) fsum+=t;
}
sum+=fsum;
}
for(int i=0;i<n;i++)
if(!dtree[i%n]&&!dtree[(i+1)%n]&&!dtree[(i+2)%n]) ++E;
cout<<sum<<" "<<D<<" "<<E;
return 0;
}