csp练题记录(C语言,编译器dev c++5.11)201909-1小明种苹果
一、问题描述
二、思路分析
ps:实在是看不懂题目中子任务的描述-_-#,望各dalao不吝赐教。
这道题和上一道一样,关心的是小明种植苹果时果子的变化情况。下面对输出的三个变量做进一步解释:
T:所有操作结束后总的苹果树,和上一道题一样,没啥难度。(ps:可参考文后相关链接上一道题的代码)
D:发生落果的果树的总棵树。这里的落果说的就是一行数据中第二个接收的正整数(小明重新统计的苹果树)和第一个正整数(该棵果树初始的苹果树)进行了疏果操作后剩下的苹果树不相等。也就是说,我们可以通过改行数据中正负的判断来看是否有落果情况,考虑到一行数据中可能有多个正整数(多次统计苹果树),故我在程序中设置了一个临时变量Di,初始值为0.只要Di不为0,说明发生了落果情况,D加一。
E:N棵果树绕成一个圈后,每相邻三棵都发生了落果,则E数加一。我设了一个一维数组flag[2]用来记录第i棵果树与它前两棵:(i-1)和(i-2)是否有落果情况。类似于移位(或者说队列正准确一点)的思想,该棵的落果情况记入flag[0],一行数据处理完毕后,后移一位至flag[1],同理,flag[1]里的数据也要后移,这样一圈下来,除了第N棵树外,其他的均能得到正确处理。由于检验第N棵果树的E的情况,实际用到3组果树组合{(N-2)(N-1)(N)}、{(N-1)(N)(1)},{(N)(1)(2)}的落果情况,故把它提出来单独处理。
三、代码
#include<stdio.h>
int main()
{
int N,m,T=0,D=0,E=0;
scanf("%d",&N);
int i,j,T0,Ti,Di=0;
int flag[3]={0},f1=0,f2=0,flagsum;
for(i=0;i<N;i++)
{
scanf("%d",&m);
scanf("%d",&T0);
for(j=1;j<m;j++)//计算每棵苹果树最后剩余的果树T0
{
scanf("%d",&Ti);
//判断进行疏果操作还是统计操作
if(Ti>0) //统计果数
{
if(T0>Ti)//发生掉果了
{
T0=Ti;
Di=Di+1;
}
}
else//进行疏果
{
T0=T0+Ti;
}
}
T=T+T0;
if(Di!=0)//算D
{
D=D+1;//确定该果树是否有掉落
flag[0]=1;
switch(i)
{
case 0:flag[0]=1;f1=1;break;
case 1:flag[0]=1;f2=1;break;
}
}
else
{
flag[0]=0;
}
if(i!=N-1)//算E
{
flagsum=flag[0]+flag[1]+flag[2];
if(flagsum==3) E++;
}
else
{
flagsum=flag[0]+flag[1]+flag[2];
if(flagsum==3) E++;
flagsum=flag[0]+flag[1]+f1;
if(flagsum==3) E++;
flagsum=flag[0]+f1+f2;
if(flagsum==3) E++;
}
Di=0;//每一行数据计算完毕后记得清零Di
flag[2]=flag[1];
flag[1]=flag[0];
}
printf("%d %d %d",T,D,E);
return 0;
}
四、相关链接
上一道题代码:https://blog.csdn.net/z_2_0_/article/details/103973794