From 9fd60173745981a999b5751702a76aa60fe748cc Mon Sep 17 00:00:00 2001 From: m0n-k1y Date: Sun, 21 Jul 2024 06:39:30 +0800 Subject: [PATCH] =?UTF-8?q?delete=203.2.1=20=E4=B8=BA=E4=BB=80=E4=B9=88?= =?UTF-8?q?=E8=A6=81=E9=80=89=E6=8B=A9=20ACM=E2=80=94=E2=80=94=E8=B0=88?= =?UTF-8?q?=E8=B0=88=E6=88=91=E4=B8=8E=20ACM=20update=207.1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vitepress/sidebar.js | 22 ++- ...什么要选择ACM——谈谈我与ACM.md | 111 ------------ ...——如何使用OJ(Online Judge).md} | 0 ...d => 3.2.2ACM 竞赛从入门到入坟.md} | 158 +++++++++--------- ...部分.md => 7.1.1.1基础(三件套).md} | 2 +- ...部分.md => 7.1.1.2进阶(小项目).md} | 2 +- ....3附录1:前端介绍(详细版).md | 47 +++++- 7 files changed, 137 insertions(+), 205 deletions(-) delete mode 100644 3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md rename 3.编程思维体系构建/{3.2.2手把手教你学算法——如何使用OJ(Online Judge).md => 3.2.1手把手教你学算法——如何使用OJ(Online Judge).md} (100%) rename 3.编程思维体系构建/{3.2.3ACM 竞赛从入门到入坟.md => 3.2.2ACM 竞赛从入门到入坟.md} (98%) rename 7.网络应用开发/{7.1.1.1基础部分.md => 7.1.1.1基础(三件套).md} (99%) rename 7.网络应用开发/{7.1.1.2进阶部分.md => 7.1.1.2进阶(小项目).md} (99%) diff --git a/.vitepress/sidebar.js b/.vitepress/sidebar.js index f776719..88b84a7 100644 --- a/.vitepress/sidebar.js +++ b/.vitepress/sidebar.js @@ -99,6 +99,8 @@ export function main_sidebar() { items: [ { text: "7.网络应用开发入门", link: "/7.网络应用开发/7.网络应用开发入门" }, { text: '7.1WEB开发入门', link: '/7.网络应用开发/7.1WEB开发入门' }, + { text: '7.1.1前端部分', link: '/7.网络应用开发/7.1.1.1基础(三件套).md' }, + { text: '7.1.2后端部分', link: '/7.网络应用开发/7.1.2.1基础部分.md' }, ] }, { @@ -112,7 +114,11 @@ export function main_sidebar() { { text: "9.计算机网络", collapsed: true, - items: [{ text: "9.计算机网络", link: "/9.计算机网络/9.计算机网络" }] + items: [ + { text: "9.计算机网络", link: "/9.计算机网络/9.计算机网络" }, + { text: '9.1 计网速通', link: '/9.计算机网络/9.1计网速通' }, + { text: '9.2.3 网络层', link: '/9.计算机网络/9.2.3网络层' }, + ] }, { text: 'Contributors', @@ -184,9 +190,8 @@ export function chapter3() { collapsed: true, items: [ { text: '3.2算法杂谈', link: '/3.编程思维体系构建/3.2算法杂谈' }, - { text: '3.2.1为什么要选择ACM——谈谈我与ACM', link: '/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM' }, - { text: '3.2.2手把手教你学算法——如何使用OJ(Online Judge)', link: '/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge)' }, - { text: '3.2.3ACM 竞赛从入门到入坟', link: '/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟' }, + { text: '3.2.1手把手教你学算法——如何使用OJ(Online Judge)', link: '/3.编程思维体系构建/3.2.1手把手教你学算法——如何使用OJ(Online Judge)' }, + { text: '3.2.2ACM 竞赛从入门到入坟', link: '/3.编程思维体系构建/3.2.2ACM 竞赛从入门到入坟' }, ] }, { text: '3.3如何选择编程语言', link: '/3.编程思维体系构建/3.3如何选择编程语言' }, @@ -424,9 +429,8 @@ export function chapter7() { text: '7.1.1前端部分', collapsed: true, items: [ - { text: '7.1.1前端部分', link: '/7.网络应用开发/7.1.1前端部分' }, - { text: '7.1.1.1基础部分', link: '/7.网络应用开发/7.1.1.1基础部分' }, - { text: '7.1.1.2进阶部分', link: '/7.网络应用开发/7.1.1.2进阶部分' }, + { text: '7.1.1.1基础(三件套)', link: '/7.网络应用开发/7.1.1.1基础(三件套)' }, + { text: '7.1.1.2进阶(小项目)', link: '/7.网络应用开发/7.1.1.2进阶(小项目)' }, { text: '7.1.1.3附录1:前端介绍(详细版)', link: '/7.网络应用开发/7.1.1.3附录1:前端介绍(详细版)' }, { text: '7.1.1.4附录2:大前端开发', link: '/7.网络应用开发/7.1.1.4附录2:大前端开发' }, { text: '7.1.1.5附录3:跨端开发', link: '/7.网络应用开发/7.1.1.5附录3:跨端开发' }, @@ -471,8 +475,8 @@ export function chapter9() { items: [ { text: '9 计算机网络', link: '/9.计算机网络/9.计算机网络' }, { text: '9.1 计网速通', link: '/9.计算机网络/9.1计网速通' }, - { text: '9.2.1 物理层' }, - { text: '9.2.2 链路层' }, + { text: '9.2.1 物理层(待完成)' }, + { text: '9.2.2 链路层(待完成)' }, { text: '9.2.3 网络层', collapsed: true, diff --git a/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md b/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md deleted file mode 100644 index cd02091..0000000 --- a/3.编程思维体系构建/3.2.1为什么要选择ACM——谈谈我与ACM.md +++ /dev/null @@ -1,111 +0,0 @@ -# 3.2.1 为什么要选择 ACM——谈谈我与 ACM - -author:wenjing - -先验条件:保证你可以在每天进行练习和学习此方面内容即使是假期也不能超过三天以上休息,如果你想验证一下这件事当然也可以,注意心态的保持很重要 - -## 将时间花在 ACM 上值得吗? - -初入大学,摆脱了高中的种种束缚,同学们想必对大学生活有着种种幻想。或许有同学依旧保持着高中的思维,希望刷取高绩点,用好成绩谋求保研。或许也有同学只想将课程草草应付,去探索一些偏实践的方向以谋求一份好工作。 - -但无论你渴望从大学生活谋求何物,我认为做为一位计算机专业的学生投身于 ACM 算法竞赛学习都是值得,无论你是否得奖。 - -## ACM 能为我带来什么? - -显然,做为一名计算机专业的学生,编程是一项必须掌握的技能。再次引用 Niklaus Emil Wirth 的一句话:**程序=算法 + 数据结构。**例如在大一开设的程序设计基础中,我们需要重点学习链表这一数据结构,熟悉运用分支与循环结构(勉强也算算法吧)。然而,在 ACM 中,这是基础到不值一提的事物,宛如空气与水一般基础。你们是否想过,花了大量课时学习的这些知识,其实小学生也可以学会(看看远处的小学编程补习班吧,家人们)那做为大学生去学习这些知识,是否应当得到一些不止于考试内容的知识呢? - -我认为有两个方向,一是我们去学习一些更底层的逻辑与原理,此外就是学习如何更好的利用链表,实现一些别的数据结构做不到的事情,我认为 ACM 可以极大的提升我们对后者的理解。 - -再从功利的角度而言,我认为学习 ACM 有以下好处 - -① 你在学习的过程中提前学习了大量接下来课堂中反复强调的知识,所有的编程对你而言都是水课,只要考试前应付一下那远离实践意义的考题即可 - -② 在招聘面试过程中,考官会问你一些短小精悍的算法题,为了应付这些算法题,你迟早要去刷 leetcode(力扣),做算法题是迟早的事。并且假若竞赛获奖的经历,也可以丰富简历 - -③ 假如你有幸活过筛选,并且获得比赛机会,并且得奖,恭喜你,你的绩点将被画上浓墨重彩的一笔。做为大学顶尖赛事,ACM 的奖项可以直接在你的最终绩点上加分(铜 0.5,银 1.0,金 1.5)这意味着你只要主课不要落下太多,奖学金随便拿(比赛获奖本身还有额外奖金)。 - -## 零基础学习 ACM 是否过于困难? - -我并不这么觉得,原因如下 - -①ACM 前期更看重你的思维能力而不是代码能力,很多题你可能需要很多纸上的推演,但最后代码可能只有十几行,到冲击金牌的阶段需要思维与码力齐驱,但那太远了。 - -固然,码力需要大量的练习,零基础尤其是第一次接触编程的同学会感到困难,但在度过初期后,限制你写题水平的是你的思维水平,而思维水平就看个人的悟性和理解,这点有无基础我并不认为很重要 - -②ACM 的刘教练对零基础有特别关照,每次选集训队队员都会固定留下一定量的零基础队员,这意味在名额竞争中,你们大概率并不需要和有基础的同学直接竞争(显然也存在零基础同学更强的例子),而是与其他同为零基础的同学竞争 - -③ 在初高中参加竞赛的学生的数量和质量有极可能已经有所下降,因为竞赛相关政策的紧缩,稀烂的强基计划替代了对竞赛友好的自主招生,选择全力投身竞赛,拼搏省队的学生有所下降,有基础的学生现在也不见得很强。 - -UPD at 2023/7/19:从长期来看,这个结论应该是没有错的,但是很可惜,如果您是2023届的新生,您将遭遇紧缩政策下一波不得不来hdu的竞赛高材生,截至笔者更新为止,已经有五位NOI银牌选手和两位具备NOI银牌能力的选手提前加入了集训队,也许对于零基础的同学而言,仍然只要和别的零基础同学竞争保底的三个席位就好了。但从长远来看,进队不是结束,抢夺比赛机会才是开始。而且如果hdu能抢到这样的生源,其他学校的水平大概率也会上涨,就算有了比赛机会也很难说会不会拿铜遗憾结尾。如果您出于好奇,想了解这荒谬的景象是如何诞生,请参阅电子书[《整型溢出》](https://zhuanlan.zhihu.com/p/117660874) - -进队的学生零基础偏少,如果你选择这条路你可能需要克服不小的困难 - -## 我应该以什么态度学习 ACM? - -假如你是一位有信息竞赛基础,且得过省级奖项的前 oier,您也没什么必要看这篇文章,您已经完全熟悉了算法竞赛需要的一切,我希望您不要有太大压力,做最好的自己就行,不要留下遗憾。对于零基础的同学也一样,或许得奖后的绩点加成实在是过于诱人,但竞赛获奖这种事情还是太难强求,让自己压力太大得不偿失。 - -这里我想谈谈我的经历,我从初中开始学习算法竞赛,一开始只是抱着试试看的心态,结果发现自己还过的去,获得普及组一等奖,便继续学习去冲击一等了。 - -转折点在初二下的暑假,当时特长生这一机制仍旧活跃存在,只要拿到提高组一等奖或者分数在一等线附近,你就有机会无视中考成绩上一所好高中,于是我从这个暑假开始就几乎再也没有回到过初中(除了最后一个月,因为学校不希望我分数太低拉低平均分影响招生,虽然分数对我而言根本无所谓)这也成为我很大的一个遗憾,关键一年的缺失使我几乎与初中的同学到现在不存在任何感情纽带,名字也不记得几个了。 - -转回正题,封闭式的竞赛集训让我感到无比痛苦,一边是升学的巨大压力,竞赛比起中考存在着更多偶然性,倘若在十一月的比赛中失误,我将前功尽弃,用于竞赛的时间毫无意义,文化课也将因此与其他同学拉开差距;另一边是同一届的神仙太多,我能走到集训这一步也许已经比很多人优秀,但和那些”神“比起来还是差太多,能力上难以填平的鸿沟与青春期的烦恼让我活的浑浑噩噩。 - -如果不出意外的话,我的人生就要出意外了。在那一年的 NOIP(信息学竞赛省赛)中,我在 DAY1 取得了满分的好成绩,于是我飘了,我在做一个梦,我真的不如那些”神“吗,我是否也可以做到更多?于是我 DAY2 死磕难题,分数爆炸了,最终差五分够到一等线。 - -之后的日子是灰暗的,浑浑噩噩的训练,知难而退放弃最好的高中的特长生名额。故事很长,我只是想说学竞赛不要太功利,竞赛终究是少数高手的游戏,做不到就是做不到,但这也仅仅只代表你的竞赛能力不够,你的人生并不是只有竞赛,大学也不只有 ACM 一条路(这很显然,不然我们社团应该改名为 ACM 社) - -## 再谈 ACM 为我带来什么 - -我初中成绩并不差,但发挥失常的话确实上不了我毕业的高中。我高考发挥失常,竞赛通过杭电三一成为保底。 - -但倘若说存在一个一开始就没有学过竞赛的我,我是否在考试分数上会有更高的成就呢?可惜人生没有如果。 - -进入大学,再次拾起算法竞赛,这次,我并不觉得惶恐与焦虑,因为无论是否得奖,我享受研究算法的过程,欢喜于做出难题带来的成就感,我在愉悦的学习,这样就够了。 - -我在说的不止 ACM 能为我们带来什么,我也在说学习能为我们带来什么。或许,考试只是给我们一个去学习的借口;或许,考试周的应试复习只是生活中无可避免的无意义之事。需要应付的无意义事物总是存在,你不能保证自己的每分每秒都被投入于黄金般的事业中。如果学习 ACM 让你感到有趣,那就去学,不需要别的理由。 - -截止完成这篇文章为止,笔者仍在集训队中,我害怕自己被淘汰,不是因为我害怕自己失去参赛资格,而是我很难想象自己失去 ACM 的生活,我需要一个学习 ACM 的理由。给诸位讲个笑话,某一天我与朋友出门游玩,想不到话题,于是就开始讨论算法题的做法,从正午到日落。 - -## 算法思维与应试思维 - -众所周知,ACM 是开卷竞赛,你可以携带纸质资料进入考场。 - -这时可能就会有同学特别开心,哎呀,这不就是开卷考试嘛,我平时程设期末考试都不能开卷,这开卷了还不简单,我直接对着书抄抄抄不就好了。 - -熟悉编程的朋友可能知道,有一个词叫做”模块化编程“,这意味着你将程序的功能拆解,让你的主函数由一个个定义好的函数组成。 - -同样,在你对 acm 题面进行转换后,问题可以被拆成一个个小模块。例如我现在要对某个数组进行排序,其实我根本不用知道排序算法是怎么进行的,我只要从纸质资料上扒一段代码就行。 - -但是,假如你一直依赖这些现成的代码,不思考算法的内核,仅仅把他们看做一个个提供输入输出映射关系的”黑箱“,ACM 会容许你这样生搬硬套,死记硬背的选手占上风吗?不见得。 - -首先对于更高层次的题目,为了防止重题,直接套板子基本是不可行的,你需要对一些代码进行优化和调整。倘若你把代码看作一个个黑箱,又该如何去调整他呢? - -其次,将一个算法学的透彻,对我们的算法思维大有裨益。 - -比如大家以后耳熟能详的快速排序,他的思维可以实现 O(n)求出第 k 大的数;而归并排序的思维不仅可以用于大量分治问题,例如其衍生算法 cdq 分治,其合并区间的思想也可以用于线段树。 - -只会抄板子的选手能理解这些吗?假如我们对代码死记硬背,生搬硬套,我们的知识体系就是离散化的,缺少关联的。不利于我们今后的发展。 - -也许在一次次陈旧腐朽的选拔性考试中,应试思维取得了压倒性的胜利。但在 ACM 中,算法思维依旧有一片净土。 - -## 数学与算法思维 - -那么,如何培养算法思维呢?我认为首先我们得学好数学。然而,我最总是在大一中听到这样的声音:“哎呀,烦死了,我们是学编程的,为什么要花那么多精力学数学,还占那么多学分,真讨厌。“然而,比起枯燥乏味的编程课,我最喜欢的还是数学课。数学在算法中无处不体现,可以说学好算法就是要学好数学,我现在复盘我初中 OI 生涯的失败,很大程度归因于数学基础的薄弱。以下为几个体现数学在算法中重要性的例子。 - -① 众所周知,ACM 是组队比赛,比起国内三个狂战士无需分工嗯干,国外有较为成熟的组队合作机制。一般由一位擅长开题拆解题意转换模型的队员,一位码力超群擅长高级数据结构的队员,剩下一位,则会跨专业选取一位数学系的学生,由此可见数学的重要性。 - -② 计算机中有大量的算法直接运用了数学,例如,快速幂的正确性需要数学推导,利用快速幂求乘法逆元也直接用到了费马大定理。 - -③ 计算机算法本就是数学的一部分,翻开计算机学生必修课程离散数学的课本,你会发现图论中的最短路算法,甚至网络流算法,都是离散数学的一部分。 - -④ 获奖的 ACM 队员就没有数学差的。 - -现如今,学科与学科之间并不是的独立的,数学系的学生也会学习编程,去解决一些算法问题,例如我们学校理学院的一位老师就有在做算法理论方向的研究。 - -反过来说,计算机的学生也可以好好学习数学,加深对算法的理解。哪怕以后去从事热门的人工智能方向,数据处理、卷积(虽然此卷积非彼卷积)、反向传播、感知机、神经网络等知识点都离不开数学。 - -优秀的数学思维能使你在理解算法的路上事半功倍,当然,算法的学习也能加深你对数学的理解。 - -## 结论 - -大胆去学 ACM 吧,大一的空闲时间真的很多,去探索新事物,不试试怎么知道自己行不行。 diff --git a/3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md b/3.编程思维体系构建/3.2.1手把手教你学算法——如何使用OJ(Online Judge).md similarity index 100% rename from 3.编程思维体系构建/3.2.2手把手教你学算法——如何使用OJ(Online Judge).md rename to 3.编程思维体系构建/3.2.1手把手教你学算法——如何使用OJ(Online Judge).md diff --git a/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md b/3.编程思维体系构建/3.2.2ACM 竞赛从入门到入坟.md similarity index 98% rename from 3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md rename to 3.编程思维体系构建/3.2.2ACM 竞赛从入门到入坟.md index 67aeedb..b3079fa 100644 --- a/3.编程思维体系构建/3.2.3ACM 竞赛从入门到入坟.md +++ b/3.编程思维体系构建/3.2.2ACM 竞赛从入门到入坟.md @@ -1,79 +1,79 @@ -# 3.2.3 ACM 竞赛从入门到入坟 - -> 作者:[选择公理](https://github.com/axiomofchoice-hjt) -> -> 利益相关:2021 杭电六队,2022 杭电一队成员 - -相信大家从前面的文章中已经了解 ACM 的基本情况,这里就不赘述了。 - -首先需要强调的是,选择 ACM 这条路非常辛苦,每天要花大量时间刷题;同时,ACM 也是残酷的,唯有实力才能保证你不被集训队淘汰。 - -这里就不得不提一下参加 ACM 竞赛的一般流程了: - -1. 大一上:参加集训队选拔,进入集训队(错过选拔的要用 [Codeforces](https://codeforces.com/) 分数来向老刘申请)。 -2. 大一下:主要是个人训练,经历多轮淘汰,期末会组队(三人一队)。 -3. 大一暑假:以组队形式参加多校等训练,这些训练将决定你在大二这个赛季能参加几次比赛。 -4. 大二:训练或比赛。没比赛资格没关系,你可以沉淀,大三还有机会。 -5. 大三同上,但是也有选择退出的。 - -## 第一阶段 - -打 ACM 要趁早。从上面流程图可以看出来,大一入学就应该决定好了,然后是学习,再然后参加选拔(冷知识:集训队不是想进就能进的)。 - -### 群 - -首先是加群。每一届老刘都会弄个杭电 ACM 新生群,没有门槛的。想要加这个群,可以问一问杭电的其他群 / 学长学姐。 - -群里主要关注两件事,一个是 ACM 公选课,一个是选拔。然后有问题也可以丢群里。 - -### 公选课 - -老刘每学期都有公选课,大一上的时候可以去旁听。公选课的内容和选拔是相关的,课讲了哪些,选拔就考哪些。所以,跟上课程进度是很有必要的。 - -### 要学什么 - -编程语言(C/C++)是算法的前提,而公选课是不会教你语言的,得自学。零基础的同学要注意了,千万不要跟着 C 语言的课来学,太慢了。尽量在一个礼拜内学完 C 的基础内容(指针可以跳过),然后跟上公选课。C++ 可以晚点再学。 - -说明一下,语言其实包含很多语法,但是 ACM 用得到的只是其中的一个子集。像 C 的指针,C++ 的模板,都是很难但是鸡肋的知识点。如果你要做工程,那这些语法都得学。 - -学会语言后,可以找一个算法书(算法竞赛入门经典(刘汝佳),算法赛进阶指南(李煜东)等等)系统学习各种算法。 - -提醒一下,这里讲到的所有东西都要上机实践,ACM 非常注重实践。你在开始学语言的时候就要多上机。 - -### 选拔 - -在大一上 10 月开始,每个月至少 1 场选拔赛(上机编程的模式),每场比赛都会根据参选人员的实际表现确定若干数量的同学入围集训队。 - -除了选拔,还有一种进队方法那就是 [Codeforces](https://codeforces.com/)。Codeforces 每个账号都会有一个分数(rating),打 Codeforces 比赛打得好就上分,反之就掉分。只要大一上你的 rating 连续三次达到 1400(具体以老刘为准),就可以向老刘申请入队。事实上,这种方法甚至到了大二都是可以的(大二你的 rating 可能要 1900),不过几乎没有人这么做,所以还是要趁早。 - -大一上会选拔 50-60 人,大一下会保留 20 人左右。(仅供参考) - -## 第二阶段 - -恭喜你,你已经学完了基础算法,可以进入以刷题为主的学习模式了。 - -刷题平台(OJ)有很多,如果没有特别适合你的,那就去刷 [Codeforces](https://codeforces.com/)。因为这个平台比赛多,老刘认可。建议 Codeforces 的每场比赛都参加(如果时间不好可以第二天补上)。 - -说到时间,Codeforces 比赛最常见的时间是 22:35 到 00:35(Codeforces 是俄罗斯的,有时差,所以时间有点阴间)。ACMer 其实很多都是熬夜党。 - -打完比赛,建议钻研一下自己没做出的前一两题,写个题解。为什么要写题解呢,一个是方便以后来回顾,一个是加深印象,一个是把自己的思维用文字表达出来,这样能发现思维的漏洞(比如证明不严谨之类的)。题解写出来发不发博客就看个人喜好吧。作者以前也是坚持写博客写了很久。 - -![](https://cdn.xyxsw.site/Axiomofchoice_1.png) - -为什么要打 Codeforces 比赛呢?主要原因是打比赛有计时,有压力(怕掉分的压力),能让人提升更快。不要因为怕掉分就不参加了,你要相信只要你一直打比赛,你的 rating 曲线一定是波动上升的。 - -另外建议大家整理一个自己的模板(算法套路),这里推荐几个资料供参考:[OI Wiki](https://oi-wiki.org),[Kuangbin 模板](https://kuangbin.github.io/2018/08/01/ACM-template/)。想要验证模板可以去 [luogu](https://www.luogu.com.cn/),luogu 收录了很多模板题。 - -## 第三阶段 - -恭喜你,你应该已经度过淘汰阶段,到了组队环节了,祝愿你组队能抱到大腿。 - -有了队伍,可以考虑一下分工问题,包括读题、键盘手、各种算法类型等分工。这里建议对于任何一类问题(比如数据结构),队伍里要有至少两个人擅长,因为两个人讨论解决问题比一个人要快很多很多。而在比赛中期,最好的策略也是双开,即两个人研究一题,剩下一个研究另一题(不过这只是经验之谈了)。 - -如果你在激烈的竞争中获得参赛资格,那么你基本可以认为你有至少银牌的实力了。(~~拿了铜牌及以下老刘会生气的~~) - -## 退役的姿势 - -打 ACM 很多是为了方便找工作的,但是作者这届找工作太难了😭,光凭借 ACM 奖牌是远远不够的,要拥有好多其他能力。 - -不管你 ACM 是否取得了成绩,建议退役后要好好做规划,多了解行情,选择好的方向进行研究。 +# 3.2.3 ACM 竞赛从入门到入坟 + +> 作者:[选择公理](https://github.com/axiomofchoice-hjt) +> +> 利益相关:2021 杭电六队,2022 杭电一队成员 + +相信大家从前面的文章中已经了解 ACM 的基本情况,这里就不赘述了。 + +首先需要强调的是,选择 ACM 这条路非常辛苦,每天要花大量时间刷题;同时,ACM 也是残酷的,唯有实力才能保证你不被集训队淘汰。 + +这里就不得不提一下参加 ACM 竞赛的一般流程了: + +1. 大一上:参加集训队选拔,进入集训队(错过选拔的要用 [Codeforces](https://codeforces.com/) 分数来向老刘申请)。 +2. 大一下:主要是个人训练,经历多轮淘汰,期末会组队(三人一队)。 +3. 大一暑假:以组队形式参加多校等训练,这些训练将决定你在大二这个赛季能参加几次比赛。 +4. 大二:训练或比赛。没比赛资格没关系,你可以沉淀,大三还有机会。 +5. 大三同上,但是也有选择退出的。 + +## 第一阶段 + +打 ACM 要趁早。从上面流程图可以看出来,大一入学就应该决定好了,然后是学习,再然后参加选拔(冷知识:集训队不是想进就能进的)。 + +### 群 + +首先是加群。每一届老刘都会弄个杭电 ACM 新生群,没有门槛的。想要加这个群,可以问一问杭电的其他群 / 学长学姐。 + +群里主要关注两件事,一个是 ACM 公选课,一个是选拔。然后有问题也可以丢群里。 + +### 公选课 + +老刘每学期都有公选课,大一上的时候可以去旁听。公选课的内容和选拔是相关的,课讲了哪些,选拔就考哪些。所以,跟上课程进度是很有必要的。 + +### 要学什么 + +编程语言(C/C++)是算法的前提,而公选课是不会教你语言的,得自学。零基础的同学要注意了,千万不要跟着 C 语言的课来学,太慢了。尽量在一个礼拜内学完 C 的基础内容(指针可以跳过),然后跟上公选课。C++ 可以晚点再学。 + +说明一下,语言其实包含很多语法,但是 ACM 用得到的只是其中的一个子集。像 C 的指针,C++ 的模板,都是很难但是鸡肋的知识点。如果你要做工程,那这些语法都得学。 + +学会语言后,可以找一个算法书(算法竞赛入门经典(刘汝佳),算法赛进阶指南(李煜东)等等)系统学习各种算法。 + +提醒一下,这里讲到的所有东西都要上机实践,ACM 非常注重实践。你在开始学语言的时候就要多上机。 + +### 选拔 + +在大一上 10 月开始,每个月至少 1 场选拔赛(上机编程的模式),每场比赛都会根据参选人员的实际表现确定若干数量的同学入围集训队。 + +除了选拔,还有一种进队方法那就是 [Codeforces](https://codeforces.com/)。Codeforces 每个账号都会有一个分数(rating),打 Codeforces 比赛打得好就上分,反之就掉分。只要大一上你的 rating 连续三次达到 1400(具体以老刘为准),就可以向老刘申请入队。事实上,这种方法甚至到了大二都是可以的(大二你的 rating 可能要 1900),不过几乎没有人这么做,所以还是要趁早。 + +大一上会选拔 50-60 人,大一下会保留 20 人左右。(仅供参考) + +## 第二阶段 + +恭喜你,你已经学完了基础算法,可以进入以刷题为主的学习模式了。 + +刷题平台(OJ)有很多,如果没有特别适合你的,那就去刷 [Codeforces](https://codeforces.com/)。因为这个平台比赛多,老刘认可。建议 Codeforces 的每场比赛都参加(如果时间不好可以第二天补上)。 + +说到时间,Codeforces 比赛最常见的时间是 22:35 到 00:35(Codeforces 是俄罗斯的,有时差,所以时间有点阴间)。ACMer 其实很多都是熬夜党。 + +打完比赛,建议钻研一下自己没做出的前一两题,写个题解。为什么要写题解呢,一个是方便以后来回顾,一个是加深印象,一个是把自己的思维用文字表达出来,这样能发现思维的漏洞(比如证明不严谨之类的)。题解写出来发不发博客就看个人喜好吧。作者以前也是坚持写博客写了很久。 + +![](https://cdn.xyxsw.site/Axiomofchoice_1.png) + +为什么要打 Codeforces 比赛呢?主要原因是打比赛有计时,有压力(怕掉分的压力),能让人提升更快。不要因为怕掉分就不参加了,你要相信只要你一直打比赛,你的 rating 曲线一定是波动上升的。 + +另外建议大家整理一个自己的模板(算法套路),这里推荐几个资料供参考:[OI Wiki](https://oi-wiki.org),[Kuangbin 模板](https://kuangbin.github.io/2018/08/01/ACM-template/)。想要验证模板可以去 [luogu](https://www.luogu.com.cn/),luogu 收录了很多模板题。 + +## 第三阶段 + +恭喜你,你应该已经度过淘汰阶段,到了组队环节了,祝愿你组队能抱到大腿。 + +有了队伍,可以考虑一下分工问题,包括读题、键盘手、各种算法类型等分工。这里建议对于任何一类问题(比如数据结构),队伍里要有至少两个人擅长,因为两个人讨论解决问题比一个人要快很多很多。而在比赛中期,最好的策略也是双开,即两个人研究一题,剩下一个研究另一题(不过这只是经验之谈了)。 + +如果你在激烈的竞争中获得参赛资格,那么你基本可以认为你有至少银牌的实力了。(~~拿了铜牌及以下老刘会生气的~~) + +## 退役的姿势 + +打 ACM 很多是为了方便找工作的,但是作者这届找工作太难了😭,光凭借 ACM 奖牌是远远不够的,要拥有好多其他能力。 + +不管你 ACM 是否取得了成绩,建议退役后要好好做规划,多了解行情,选择好的方向进行研究。 diff --git a/7.网络应用开发/7.1.1.1基础部分.md b/7.网络应用开发/7.1.1.1基础(三件套).md similarity index 99% rename from 7.网络应用开发/7.1.1.1基础部分.md rename to 7.网络应用开发/7.1.1.1基础(三件套).md index 47e9265..cb7a7c9 100644 --- a/7.网络应用开发/7.1.1.1基础部分.md +++ b/7.网络应用开发/7.1.1.1基础(三件套).md @@ -1,4 +1,4 @@ -# 基础部分 +# 基础(三件套) ## 🔑 萌新需要知道的前置知识 diff --git a/7.网络应用开发/7.1.1.2进阶部分.md b/7.网络应用开发/7.1.1.2进阶(小项目).md similarity index 99% rename from 7.网络应用开发/7.1.1.2进阶部分.md rename to 7.网络应用开发/7.1.1.2进阶(小项目).md index 19688c5..a5c7228 100644 --- a/7.网络应用开发/7.1.1.2进阶部分.md +++ b/7.网络应用开发/7.1.1.2进阶(小项目).md @@ -1,4 +1,4 @@ -# 进阶部分 +# 进阶(小项目) ::: warning 📌 diff --git a/7.网络应用开发/7.1.1.3附录1:前端介绍(详细版).md b/7.网络应用开发/7.1.1.3附录1:前端介绍(详细版).md index 50b0a15..8135ab8 100644 --- a/7.网络应用开发/7.1.1.3附录1:前端介绍(详细版).md +++ b/7.网络应用开发/7.1.1.3附录1:前端介绍(详细版).md @@ -6,17 +6,56 @@ 它分为狭义和广义。其中,广义其实是狭义的一个更深入的发展的结果。 -狭义就是指网页,而广义则是指互联网中一切可见的界面及交互功能。设计师负责设计出好看的界面,而前端工程师则是负责把他实现,并在实现基础上增加交互的部分和实际的功能。例如:各种 GUI、小程序 (各种)、快应用、APP 的界面、网页、鸿蒙应用等都可以由前端来完成。有些人可能会疑惑,这也算前端。我只能说,这就是大前端时代。许多人学习前端,在网上寻找教程,找到的教程都是非常远古或者基础的。由于前端的发展历史很长,教程也必须与时俱进。以前的教程仅限网页制作,但如今前端领域日新月异,各种新框架新功能不断开辟,我们不能都有所涉及,但也不能做井底之蛙。 +狭义就是指网页,而广义则是指互联网中一切可见的界面及交互功能。设计师负责设计出好看的界面,而前端工程师则是负责把他实现,并在实现基础上增加交互的部分和实际的功能。例如:各种 GUI、小程序 (各种)、快应用、APP 的界面、网页、鸿蒙应用等都可以由前端来完成。 + +有些人可能会疑惑,这也算前端。我只能说,这就是大前端时代。许多人学习前端,在网上寻找教程,找到的教程都是非常远古或者基础的。 + +由于前端的发展历史很长,教程也必须与时俱进。以前的教程仅限网页制作,但如今前端领域日新月异,各种新框架新功能不断开辟,我们不能都有所涉及,但也不能做井底之蛙。 ## 前端的学习 -因此,想要入门前端,则必须先建立一个较好的世界观,才能进行方法论的学习。最最基础的前端,也就是网页,需要从网页三剑客开始学习,即 HTML、CSS、JAVASCRIPT。这三样一个负责描述网页内容,一个负责描述网页样式,一个负责网页交互。没错,这三个就是三门语言。每门语言都有不可忽视的发展成果。大多数人在网上寻找教程,找到的都是最基础的教程,甚至没有与时俱进,比如有许多废弃的规定还在教程中,比如有新的语法规范却没有教授。我这里并不推荐有没有什么好的教程,而是要大家通过搜索引擎的帮助,让自己建立一个正确的前端世界观,而这篇文章知识来帮助你们少走弯路和死胡同。当然,如果大家想要学好前端,必须要自己学会阅读文档,而不是一些教程。因为官方文档才是最前沿的,最正确的,最全面的。 +因此,想要入门前端,则必须先建立一个较好的世界观,才能进行方法论的学习。最最基础的前端,也就是网页,需要从网页三剑客开始学习,即 HTML、CSS、JavaScript。 +这三样一个负责描述网页内容,一个负责描述网页样式,一个负责网页交互。 + +没错,这三个就是三门语言。每门语言都有不可忽视的发展成果。大多数人在网上寻找教程,找到的都是最基础的教程,甚至没有与时俱进,比如有许多废弃的规定还在教程中,比如有新的语法规范却没有教授。 + +这里希望大家通过搜索引擎的帮助,让自己建立一个正确的前端世界观,如果大家想要学好前端,必须要自己学会阅读文档。因为官方文档才是最前沿的,最正确的,最全面的。 + +- 前端三剑客 + - + - + - ## 前端的历史 -从历史中较为全面的了解前端,可以帮助你快速建立相关的观念。当然,前端的历史,大家可以看看知乎上高赞的回答。我这里只说一下我的观念。前端在历史发展中,非常注重一个理念,不要重复造轮子(DRY)。没错,别人做好的,已经很完善的,拿来用就行,除非你自己还有什么其他的需求。这个观念与其他计算机领域的观念是不一样的。这也是前端能够快速发展的重要原因之一。浏览器等设备平台对代码进行一个渲染和执行,我们必须遵守这个规范。但代码怎么样写,怎么样提高效率,怎么样支持多种写法都能得到一样的效果,这就是前端发展的一个关键。先辈们对代码进行了二次的一个编译。先辈们建立了一系列编译器等操作,使得前端能够在基石上向上发展。我们不必一板一眼的编写非常冗余的 HTML\CSS\JS 代码,而是编写特定语法的代码,然后通过代码编译成浏览器等平台可识别的 HTML\CSS\JS\其他的代码。这不仅使得我们前端开发的效率大大提高,还能把代码移植到其他平台,实现跨平台的功能。所以这才诞生出了 postcss,vue,emmet 等高效而又实用的成果。 +从历史中较为全面的了解前端,可以帮助你快速建立相关的观念。 + +当然,前端的历史,大家可以看看知乎上高赞的回答。我这里只说一下我的观念。前端在历史发展中,非常注重一个理念, + +>不要重复造轮子(DRY) + +没错,别人做好的,已经很完善的,拿来用就行,除非你自己还有什么其他的需求。 + +这个观念与其他计算机领域的观念是不一样的。这也是前端能够快速发展的重要原因之一。浏览器等设备平台对代码进行一个渲染和执行,我们必须遵守这个规范。 + +但代码怎么样写,怎么样提高效率,怎么样支持多种写法都能得到一样的效果,这就是前端发展的一个关键。先辈们对代码进行了二次的一个编译。先辈们建立了一系列编译器等操作,使得前端能够在基石上向上发展。 + +我们不必一板一眼的编写非常冗余的 HTML\CSS\JS 代码,而是编写特定语法的代码,然后通过代码编译成浏览器等平台可识别的 HTML\CSS\JS\其他的代码。 + +这不仅使得我们前端开发的效率大大提高,还能把代码移植到其他平台,实现跨平台的功能。所以这才诞生出了 postcss,vue,emmet 等高效而又实用的成果。 要说,前端为什么发展这么快,很重要的因素就是它非常热衷于开源。通过开源,大家可以一起维护一个项目,并通过传播,让其他人在它的基础上继续发展,逐渐壮大。你可以直接在前人的基础上继续发展,可以快速建立自己的生态,发现并合力解决各种 BUG。 -MDN 是个适合初学和文档查阅的网站 里面有学习前端的全流程 +- MDN 是个适合初学和文档查阅的网站 里面有学习前端的全流程 + +- roadmap上的前端路线图 + + +- 前端框架 + - + > 在官方文档学习 Vue 的过程中,强烈建议你在左上角 `API风格偏好` 中,改为组合式 + + - + + > 在官方文档学习 React 的过程中,强烈建议不要在 Class 写法停留太久,要速速学习 Hook 写法