0. 初识编程、竞赛和计算机产业

文章目录

展开

0.0 写在前面

本篇内容为本人6年来对计算机相关内容的了解与阐述,希望能够给对计算机行业感兴趣的学生一些视野。

0.1 编程是什么?

相信大家都听过了C++、Java、Python等编程语言,编程即人类通过编程语言使计算机完成预定命令的过程。

由此可见,编程语言并不重要,一个优秀的程序员是不会受编程语言限制的。无论你是学C++、Java还是Python,主要的能力在于如何利用该编程语言与计算机进行交互。

各编程语言的区别大致如下:

  • C++,更贴近底层,多数的游戏引擎及操作系统等由C++设计。
  • Java,体系更完善,目前大多数Web应用、手机应用等由Java语言进行开发。
  • Python,开源且库函数完善,可以理解为很多人在不断完善更新Python,更易上手,主要用于人工智能等领域。

了解了编程的本质,选择一门编程语言就尤为重要。

对于目前大多数高校来说,C++是理工科学生的必修课,因为其相对于Java更好上手,相对于Python又更加具象。

  • 面向过程编程
  • 面向对象编程
  • 面向切片编程

Java适合在学习C++后进行自学,如果C++的功底好,基本一个月即可上手Java。这就好比国内学习方言,当你能听懂普通话,理解东北话就非常容易了。而Python更适合于非计算机专业学生学习,因为其语言简单,无须记忆繁杂的框架,理解即编写。

为什么要通过编程解决问题呢?

计算机的发展使得快速计算成为可能,人类的优势在于智慧,但是计算力不足,计算机正好可以填补这部分空缺。

我们无法计算各种各样繁杂的数据,但是我们有解决问题的思路,将思路通过代码交给计算机,并将数据喂给程序,我们就可以利用算力来解决问题了。这也是现在人工智能普遍的要求。目前普通计算机一秒可以执行1000000000(10的9次方)次运算(简单运算,指加法和乘法),可以解决绝大多数小规模的问题。只要时间足够,甚至可以解决大规模问题。这是算力带来的优越性。

而对于程序的运行效率,CPU固然重要,但是CPU是有限的。根据摩尔定律(芯片上能集成的晶体管数每十年会翻一番),算力是会稳定上升的,但是我们要等。因此,人们要用其他方式提升程序运行效率,比如算法。我们竞赛的部分主要就是算法的介绍。举个例子,让你从1+2+3+…+100,你可以一个一个加,也可以用等差数列求和公式。后者会比前者快的多得多,这就是算法的魅力。当然,我们还可以提升CPU的核数,GPU的等级等等,但算法带来的提升远不是硬件提升可以比较的。

0.2 竞赛

在计算机领域,中学阶段有NOIP、CSP、NOI、APIOIOI等竞赛,大学阶段有ICPC、CCPC、蓝桥杯等竞赛,此外还有计算机二级等等级考试。计算机作为五大学科竞赛中唯一一门非文化课的科目,其地位可见一斑。

具体来讲,中学阶段的竞赛就像晋级之路,NOIP是面向于各省/直辖市的地方性比赛,全国命题,地方排名。近几年天津地区一等奖大概在100-150分(满分600分,一题100分,有部分分)。五年前,省一等奖就可以拿到一些双一流学校的一本线等降分政策,不过随着强基计划的提出,自主招生逐渐淡出了人们的视野。

NOIP之后就是省选,是每个省/直辖市对于优秀竞赛生的选拔,每省人数不同。选拔出来的学生组成省队参加各种夏令营和国赛。国赛即NOI,这是全国性质的比赛,奖项等级为金银铜。目前强基计划政策为银牌及以上可以申请清北等高校的政策,而铜牌可以作为加分项考虑一些其他学校。

CSP分为CSP-J和CSP-S,前者是初级水平,后者是高级水平。一般高中竞赛生可以直接考虑参加CSP-S,难度和NOIP差不多。

此外,还可以考虑考级,如计算机等级考试。考试分C++、Java、Python等多项,60/100分即算通过。

对于大家如果参加竞赛就一定会参加的NOIP和CSP-S来说,可以细化一下他的规则:

  1. 使用一种编程语言,大多数考生使用C++。

  2. 用考点的机器,全程不许访问网络。

  3. 共4题,涵盖多种类别的算法。

  4. 中文题面。

  5. 每题会有20个以上的测试用例,例如:

    程序输入两个值a和b,输出二者的和。

    则会有20组a和b,并有对应的答案。通过你写的程序输入a和b并输出答案,和标准答案做比较,相等则得到对应的分数。

  6. 程序运行有时间和空间限制,多数为1s和512MB。

    测试用例会有规模大小的分布(如n个数相加,前10个测试用例n<=100,后10个测试用例n<=100000),则对应不同的程序写法,可能会得到部分分。

0.3 计算机产业

目前的计算机产业仍然是具有很大发展空间的产业。十年前计算机的发展在软件,十年后计算机的发展在AI。

目前大学里对于计算机主要有几个方向:操作系统开发(如鸿蒙系统,这种是国家刚需)、软件开发和测试(如BAT等企业,大多数程序员的出路,不过目前有些饱和)、算法研究(分为普通算法研究和人工智能,普通算法研究即我们目前学习的竞赛算法的更高深层次,而人工智能是一个更大更新的方向)、数据处理(如数据可视化、数据挖掘与分析等)、网络安全。

中学阶段学生对计算机产业的理解主要在于软件开发,最近可能偏向人工智能,但操作系统、算法研究和数据处理也是行业内很多人在做的内容。各位可以多了解产业相关的方向,找到自己想要做的方向并多学习该方向的内容,为今后做好铺垫。

个人见解,未来智慧城市(如智慧交通、智慧校园等)将成为主流,物联网时代将会到来,这种场景下计算机领域人才是一直稀缺的。如果兴趣在这个方向,可以提前了解关于人工智能和机器学习的知识,并可以尝试与硬件结合构建机器人等。

0.4 一些小题

0.4.0 取位

数学中有取余运算和整除运算,有的程序设计语言将整数的除法和取余分别表示为”/“(整除)和”%”(取余)两种,如66\%10=6,即66除以10的余数为6;65/10=6,即65整除10的商为6。现有一个四位数N,请选用N和上面两种运算表示出N的个十百千位上的数字。

0.4.1 快速幂问题

要求a^b,正常的计算方法为a* a* a…* a(共b个a),请问如何减少计算次数。此处需计算(b-1)次乘法。

0.4.2 八皇后问题

给定一个国际象棋棋盘,将八个皇后棋子放置棋盘上。要求八个皇后棋子两两不在同一行、同一列、同一对角线,如何找到所有可能的摆放方式,给出思路。

img

0.4.3 汉诺塔问题

有三根圆柱,记为ABC。柱A上从上到下按照大小顺序放着N个圆盘,需要将其全部挪到柱C上。要求小圆盘上不能放大圆盘,每次只能移动一个圆盘。给出思路。

img

0.5 准备工作

0.5.1 安装环境

Windows 从0开始配置VScode C/C++环境 初学者向
注:从1.2开始就可以,1.1.1有如何选择的参考。看版本是 gcc --version ,原博客打错了。

【VSCode】mac系统利用VSCode配置C++环境

0.5.2 一些网站

Online Judge(在线评测系统)

洛谷,国内中学信竞里的最常用的OJ,基本可以涵盖从NOIP到NOI的题目类型和难度。注册后加入团队

codeforce,国际信竞最常用常用的OJ,每周/月会有周/月赛,题目是英文题面。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注