参加信息奥赛必须学C++吗?

文章讨论了NOIP竞赛中对C++的需求,指出基本概念题和编程题用C语言即可,复杂应用题更侧重逻辑推理而非编程语言。作者认为,参加信息奥赛学习C语言就足够,C++知识并非必要。
部署运行你感兴趣的模型镜像

 35edb1b55844375df869e66148aed4f2.png

 da29926c369542c1e59fb1a17dbdc10c.png

 c7bed49f4910710bdeca320ae95ae7aa.png

 93e00a513da4ed96d7cdb47c61d6bc6e.png

 faf021a0802112b3444e884f2a5b5e25.png

 caddf90ccebff9d079c7fbf70162a433.png

 966a4114cb12896387bdd16112654911.png

 e3473e3c95dc1bdd5bceaa2074e883f1.png

 eaffa9e01cf060bf22bb8ccbe9bf48d9.png

参加信息奥赛

  必须学C++吗?

2af870e7e09c3b1293e6f050e144120b.gif

0e7b5ad1c1bdd26a78bce47346195618.gif

导读

针对目前格蠹科技推出的创客少年C语言编程2024春季班,很多人在问,这个跟NOIP(National Olympiad in Informatics in Provinces,全国青少年信息学奥林匹克联赛)有关系吗?为什么不教C++呢?针对这些问题,我特意去看了一些 NOIP 的题目,这里统一回答。

b833612c9aedaab70e18059a90c36bed.gif

NOIP 竞赛题目有哪几类

ed1f77b5a7fb007c53e8d885ea66464f.png

NOIP 竞赛题目基本上分为3类。

01

基本概念题

第一类是基本概念题,比如关于图灵机的说法、计算机系统的定义、软件有哪些分类、计算机的核心部件、编译器的作用,等等。这类问题,我个人的看法是,找一些计算机原理方面的书看一看就可以了。做这方面的培训,我觉得价值是不大的。

02

基本的编程题

第二类是基本的编程题,比如两个数进行交换,给定几个数求最大数,给定一个3位数,把个位数和百位数进行交换,给定三角形的3边长度求面积,等等。解这类题目,主要用到的知识就是数组、排序等,用C的知识完全足够了,根本用不到C++中类的概念。我们会在培训时适当加入这类题目。

03

复杂的应用题

第三类是复杂一点的应用题。应用题很多时候考的是数学知识和逻辑推理,而不是编程本身,逻辑搞清楚了,编程就很简单了,基本上用到的也都是数组、排序等知识,用C完全足够了。你懂C++不见得就会有什么优势,因为考试的重点不是编程语言本身,而是逻辑推理。事实上,题目里也没有要求一定要用C++,要求一般是 Pascal、C、C++任何一种都可以。

b6fd932ffb365c1af0c9b6a37c883493.gif

示例题:到天宫做客

6707c4e9b0d2ce1d4acee0ae538afdb4.png

我们不妨来看个例子。这个题目叫 “到天宫做客”,是这样的:

有一天,我做了个梦,梦见我很荣幸地接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是需要在人间的,因此,我希望选一个最长的空闲时间段,使我在天上呆的时间尽量长。记住,今年是4000年。天上一天也是24小时,每小时60分,每分钟60秒。

输入

输入文件的第一行是一个非负整数N,表示4000年中我必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入文件保证无错误,日期无重复。

输出

输出文件仅一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。

输入样例

2

3 8

12 2

a2888dc5604fd6914bc61655b229890e.gif

思考与解答

f13f3a1d7bb95b19f80c900f10a98a06.jpeg

01

仔细审题,筛选信息

当我们看到这个题目时,首先要仔细地阅读题目,每个信息都是很重要的,比如 “天上一日、人间一年”,“选一个最长的空闲时间段”等,这些信息都是有用的。

输入样例只给了两个日期,即3月8日和12月2日是要在人间的,其它时间可以到天上去。这样可以到天上去的时间段有3个:1月1日(含)到3月7日(含),3月9日(含)到12月1日(含),12月3日(含)到12月31日(含)。

仅从这个例子看的话,当然是3月9日(含)到12月1日(含)的时间是最长的,但是这个只是例子,实际的时间要从输入文件里读取的,而且不一定是只有2个日期,所以每段时间都要计算。

02

计算每个时间段的天数

现在,我们来计算每个时间段的天数,这里的注意点是边界。如果首尾日期都是包含在内的,则相减后要加1,如果两边都不包含,则相减后要减1。

第一段时间,要把第一个日期减1(变成包含),再减去1月1日,再加1,样例中为

4000/03/08-1-4000/01/01+1=67

(日期数据格式是可以直接相减的)

第二段要把两个日期相减,再减1,因两边都不包含,样例中为

4000/12/02-4000/03/08-1=268

如果不止2个日期的话,后面的用同样的方法计算。

最后一段时间,把4000/12/31跟最后一个日期相减,样例中为

4000/12/31-4000/12/2=29

得到所有的天数后,找出最大值,设为max。找最大值的过程,可以算一个时间段比较一次,而不需要先把所有的时间段都算出来放到数组中,最后再计算。样例中,最大值是中间一段268天。

03

换算数据

接下来,我们计算人间的268天在天上是多少秒。根据“天上一日、人间一年”,只要算出人间的268天相当于天上的多少天就可以了。

那么问题来了,4000年一年有多少天呢?这里要考到一个关于闰年的知识。闰年的定义是,能够被4整除但不能被100整除除非又能被400整除的年份,所以4000年是闰年,一年应该是366天。

当然也可以直接用代码计算:

4000/12/31-4000/01/01+1=366

就是4000年一年的天数。

最后,我们根据天上一天是86400秒,根据公式max/366*86400得出在天上的时间。样例中的结果是:

268/366*86400=63266秒

(四舍五入的结果)

现在我们回过头来看看,用到的编程知识有哪些,读取文件,构造日期,日期相减,数组(可以不用),求最大值,数值转换,输出到文件。这些用的都是C语言的知识,即使你会C++,用的还是C语言的知识,因为根本不需要用到类的概念。

由此例可以看出,参加信息奥赛根本不需要学习C++,学习C完全足够了。

【END】

【盛格塾】

正心诚意,格物致知

人文情怀审视软件,以软件技术改变人生

982b9030c8ad0ef0e5615b0ec96f4c65.png

格友公众号

efa37e91c9146e898fc0165e17588108.png

盛格塾小程序

扫描上方二维码或在微信中搜索“盛格塾”小程序

可以阅读更多文章和有声读物

994a4d4b1ee1e9d948a2d05c7fb7149b.gif

往期推荐

AI都可以写代码了, 还有必要学编程吗?

幽兰满庭开,清香随风来——格蠹科技的幽兰本大揭秘

学编程就选C语言

雏鹰展翅——创客少年C语言编程2024春季班即将开讲

您可能感兴趣的与本文相关的镜像

Kotaemon

Kotaemon

AI应用

Kotaemon 是由Cinnamon 开发的开源项目,是一个RAG UI页面,主要面向DocQA的终端用户和构建自己RAG pipeline

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值