【CCF】中间数(C++)满分答案分享

本文作者分享了解决CCF中间数问题的思路与过程,从最初的20分到最终获得满分100分的演变。在解题过程中,作者详细描述了遇到的陷阱,如误判中间数定义、边界值处理不当等问题,并给出了正确的C++代码。文章强调了全面思考问题、审题细致和理解概念的重要性。

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

一、解题历程


  看完题目,我的第一反应是用嵌套循环,i从0到n,让a[i]与每一个数进行比较,用more数组来存放比a[i]大的个数,用less数组来存放比a[i]小的个数,最后用遍历a[i],判断每个a[i]的less和more是否相等,是就输出该数,否则输出-1,并且跳出循环。考虑到可能会有多个相同的数,他们都是中间数,所以只要找到一个输出即可。
  
  想到这里,觉得逻辑上没什么问题,就照着思路写出代码,提交后发现只有20分,检查后发现是由于在最后一步输出时,判断输出-1后没有break出循环,所以输出多次-1导致测试失败。
  
  把这个bug改过来后,又提交一遍,发现只有80分,想了很久,突然发现n的取值为1或者2的时候情况很特殊,这时候会发生比a[i]大或者小的个数为0的情况,于是补上n=1时和n=2时的处理,
  (1)n=1时,比它大或者小的个数都为0,所以直接输出这个数就ok了
  (2)n=2时,一开始以为是2个不同的数,想当然的就直接输出-1
  
  提交上去只有90分,我一想,是不是n=1时的处理出问题了,然后觉得没有比它大或者小的数,这个数怎么能叫中间数呢,于是就又把n=1的处理改成直接输出-1,一提交又变回80分,然后又重新看题意,发现原来对中间数的认识是对的,即使比它大或者小的个数都为0,这个数也叫中间数,因为题目中说了 “如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。”
  
  既然n=1的处理没问题,那问题只能是在n=2的处理上了,突然发现遗漏了两个数相等时的情况,此时本质上就跟n=1时一样,直接输出该数就ok了。
  
  由于担心n>2时的处理有问题,又仔细地想了一下,发现n>2时,每个数的比它大或者比它小的数肯定不为0,所以不会出现前面的bug了,这时重新提交,终于100分了。

二、小结


  通过这道题,我更加认识到自己的不足:在思考问题方面不够全面,经常是先想到一个点,就开始动手做,然后发现有问题了再去找原因,这样逻辑混乱,常常会出现遗漏。
  针对以上不足,首先应该先全面严谨的罗列问题的所有可能性,再分别对不同情况进行处理(尤其是测试例中的边界值),这样才能更有条理性和逻辑性,而且在考场上,是无法当场测试的,如果出了bug,我却没有发现,这是很可怕的。其次是审题时要仔细不要想当然的自以为是这样的,不要自己觉得,要仔细读题,深入理解每个概念的核心本质,不要自己加一些修饰,像这道题一样,就不应该画蛇添足,曲解中间数的定义而导致丢分。

三、满分代码

在这里插入图片描述

#include<iostream>
using namespace std;
int main(){
   
   
	int n;
	cin>>n;
	if(n==1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值