2020年12月8日CCF201909-2小明种苹果(从坑里爬起来)

这道题,当初我考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出题人摆了一套.....

后来看别人的满分代码,把自己的一点一点改成别人的样子,却发现错在了自己认为最正确无误的地方:统计自然脱落那......

我没能想到,这小明,居然会多一棵树进行多次重新统计.......(掉了就掉了呗,总数来数去干嘛)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值