针对目前格蠹科技推出的创客少年C语言编程2024春季班,很多人在问,这个跟NOIP(National Olympiad in Informatics in Provinces,全国青少年信息学奥林匹克联赛)有关系吗?为什么不教C 呢?针对这些问题,我特意去看了一些 NOIP 的题目,这里统一回答。
NOIP 竞赛题目基本上分为3类。第一类是基本概念题,比如关于图灵机的说法、计算机系统的定义、软件有哪些分类、计算机的核心部件、编译器的作用,等等。这类问题,我个人的看法是,找一些计算机原理方面的书看一看就可以了。做这方面的培训,我觉得价值是不大的。
第二类是基本的编程题,比如两个数进行交换,给定几个数求最大数,给定一个3位数,把个位数和百位数进行交换,给定三角形的3边长度求面积,等等。解这类题目,主要用到的知识就是数组、排序等,用C的知识完全足够了,根本用不到C 中类的概念。我们会在培训时适当加入这类题目。
第三类是复杂一点的应用题。应用题很多时候考的是数学知识和逻辑推理,而不是编程本身,逻辑搞清楚了,编程就很简单了,基本上用到的也都是数组、排序等知识,用C完全足够了。你懂C 不见得就会有什么优势,因为考试的重点不是编程语言本身,而是逻辑推理。事实上,题目里也没有要求一定要用C ,要求一般是 Pascal、C、C 任何一种都可以。
我们不妨来看个例子。这个题目叫“到天宫做客”,是这样的:
有一天,我做了个梦,梦见我很荣幸地接到了猪八戒的邀请,到天宫陪他吃酒。我犹豫了。天上一日,人间一年啊!当然,我是个闲人,一年之中也没有多少时日是需要在人间的,因此,我希望选一个最长的空闲时间段,使我在天上呆的时间尽量长。记住,今年是4000年。天上一天也是24小时,每小时60分,每分钟60秒。
输入
输入文件的第一行是一个非负整数N,表示4000年中我必须呆在人间的天数,以下共N行,每行两个用空格隔开的正整数,即日期(月,日),输入文件保证无错误,日期无重复。
输出
输出文件仅一行包含一个非负整数,即在天上的时间(四舍五入精确到秒)。
输入样例
2
3 8
12 2
当我们看到这个题目时,首先要仔细地阅读题目,每个信息都是很重要的,比如“天上一日、人间一年”,“选一个最长的空闲时间段”等,这些信息都是有用的。
输入样例只给了两个日期,即3月8日和12月2日是要在人间的,其它时间可以到天上去。这样可以到天上去的时间段有3个:1月1日(含)到3月7日(含),3月9日(含)到12月1日(含),12月3日(含)到12月31日(含)。
仅从这个例子看的话,当然是3月9日(含)到12月1日(含)的时间是最长的,但是这个只是样例,实际的时间要从输入文件里读取的,而且不一定是只有2个日期,所以每段时间都要计算。
现在,我们来计算每个时间段的天数,这里的注意点是边界。如果首尾日期都是包含在内的,则相减后要加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天。
接下来,我们计算人间的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完全足够了。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved