【CCF 2019 9】2-小明种苹果(续)

本文介绍了一道关于统计果树苹果掉落情况的算法题,使用C++进行解答。题目要求统计发生掉落的果树数量及连续三棵果树都发生掉落的次数,通过巧妙的数据结构设计和算法优化,实现了高效求解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目分析:读这个第二题比以往第二题要更细心,中间涉及的各种量有点多,但题目说得很明确,最后要给出三个答案,就分开算呗,计算步骤还是挺简单的。
题目难点:既要统计发生掉落的苹果棵树,又要统计连续三棵果树掉落的情况的次数。因为题目规定将所有果树围成一个圈,所以第二种情况要好好想想该怎么处理。
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值