参加信息奥赛必须学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春季班即将开讲

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值