ccf-csp计算机软件能力认证201909-2小明种苹果(续)(C语言版)
题目内容:
解题思路
首先思考如何存取数据,由于不会所有数据进行计算,所以我使用了边存边用的方法,每读取一个数据,计算完成后再读取下一个数据。
第二步三个值t,d,e的计算:
t的计算很简单,注意每次进行统计数量时更新树上苹果数的值即可;
d的计算,借用辅助参数d1,另其初始值为0,若发生落果,则另其值变为1,对于每一棵树若d1的值为1,则d的值+1即可;
e的计算,借用辅助参数e1,另其初始值为0,若这棵树发生落果,则另其值+1,若这棵树未发生落果,则另其值重新变为0,当e1的值大于等于3时即可说明有三棵树连续发生落果。需要注意的是作为一个有n棵树的圈,(1,2,n)和(1,n,n-1)这两个要单独判断,所以我对这四个点单独进行取值最后加在e的值上即可。
提交后得100分的C语言程序如下:
#include<stdio.h>
int main()
{
int n,m,i;
int d=0,d1;//掉落棵树以及判断条件
int e=0,e1;//连续三颗掉落次数以及判断条件
int fir=0,sec=0,last1=0,last2=0;//前两次和后两次是否发生落果
int t=0,now,tem;//树上总苹果树以及辅助值
scanf("%d",&n);
i=n;
while(i--){
scanf("%d %d",&m,&now);
d1=0;m--;//d1为0代表未发生落果,每次重置
while(m--){
scanf("%d",&tem);
if(tem<=0) now=tem+now;//疏果则直接加
if(tem>0&&tem!=now) {now=tem;d1=1;}//判断是否落果
}
t=t+now;//目前苹果总数
if(d1==1&&i==(n-1)) fir++;//第一次是否发生落果
if(d1==1&&i==(n-2)) sec++;//第二次是否发生落果
if(d1==1&&i==0) last1++;//最后一次是否发生落果
if(d1==1&&i==1) last2++;//倒数第二次是否发生落果
if(d1==1) {d++;e1++;}//此次发生则e1+1
if(d1==0) e1=0;
if(e1>=3) e++;//e1大于等于三则说明连续三棵发生落果
}
if(fir==1&&sec==1&&last1==1) e++;//第一二和最后一次是否同时发生
if(fir==1&&last2==1&&last1==1) e++;//第一和最后以及倒数第二次是否发生
printf("%d %d %d",t,d,e);
return 0;
}