这道题,当初我考CCF时给了我0分,如今重新写又会如何呢..........
题意:
题目意思大致是,告诉你有N棵树,接下来N行,每一行的第一个输入m代表小明对这棵树进行的统计次数,后面便是那m个统计数据。统计数据的第一个数,一定是一个大于0的整数,代表这一棵果树最初的果子数量,之后的统计可能为正,也可能不是。如果为正,证明小明对这一棵果树又一次进行了统计,看是否发生“苹果的自然脱落”,否则(包括负数和正数),就只是小明自己摘了去了。
我们需要做的,是算出最终所有果树的果子总数,以及有多少棵果树被小明发现发生了自然脱落,再而是如果这N棵果树是一个环,每三棵连续果树发生自然脱落算一组的话,问有多少组。
思路:
板块分为两部分:
第一,统计好最终的果子数,每一棵果树是否被发现有自然脱落,以及这样的果树有多少棵
第二,按照题目的思路,看能形成多少组
具体代码如下:
#include<iostream>
using namespace std;
int n,m;
int t;
int sum=0,sum1=0;//前者用来统计最终的总果子数,后者用来统计每一棵果树的果子数
bool re[1001];//哪些发生了自然脱落
int count=0;//发生了自然脱落的果树数量
int i,j;
int pp=0;//组数
int main() {
fill(re,re+1001,0);
cin>>n;
for(i=0; i<n; i++) {
cin>>m;
cin>>sum1;
for(j=1; j<m; j++) {
cin>>t;
if(t>0) {//遇上了又一次的总数统计
//注意,这里必须有!re[i],因为可能一棵树被发现了多次“自然脱落”,而我们的count只统计发现的第一次
if(!re[i]&&t!=sum1) {
re[i]=1;//登记发现了自然脱落
count++;
}
//因为上面只管统计这棵树有没有发生“自然脱落”,所以果子数的更新处理要单独拿出来
sum1=t;//更新真正的果子数
} else
sum1+=t;//统计这棵树的总果子数
}
sum+=sum1;//sum统计总共的果子数
}
/*之后就是统计组数了*/
int i1,i2;
for(i=0; i<n; i++) {
if(re[i]&&re[(i+1)%n]&&re[(i+2)%n])
pp++;
}
if(n<3)
pp=0;
cout<<sum<<' '<<count<<' '<<pp;
}
折腾了一下午,写的时候这两个部分我都单独进行了验证、调试,但后来却一直都是50分。
后来回想起当初刚考完的时候,有人发现如果只有3棵树,并且都发生了自然脱落,那么得到的组数会是3,那时没注意到这点,便认为自己掉进了这个坑,结果这回写反应过来并更改后,发现变为了40分,原来那时大家反而被CCF出题人摆了一套.....
后来看别人的满分代码,把自己的一点一点改成别人的样子,却发现错在了自己认为最正确无误的地方:统计自然脱落那......
我没能想到,这小明,居然会多一棵树进行多次重新统计.......(掉了就掉了呗,总数来数去干嘛)