csp练题记录(C语言)201909-2小明种苹果(续)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值