Abstract
这个是2023年5月14日我在图灵算法协会进行演讲的讲义。
在我学习算法时,学院并没有关于算法的学习组织。作为图灵算法协会第一届的负责人,我想去分享一下我学习算法知识的心路历程,为以后的学弟学妹提供学习的思路,希望能对他们有所帮助。

如果您喜欢我的创作,可以赞助我。您的支持将帮助我继续创作更多优质内容,感谢您的慷慨支持!

算法竞赛入坑指南

图灵算法协会

为什么要组建社团

学校每年会有很多比赛:程序设计大赛、互联网+…(唱歌的、跳舞的…)

教务处网站

about 参加比赛的意义

获奖 or 奖学金 or 锻炼自己?? or 拿奖装逼


算法比赛:既简单又难的比赛

  • 简单:全全靠自己
  • 难点:全全靠自己

有没有发现很多比赛,都是老师带着参加的?老师为什么带你?

没有参加过比赛的新同学如何参加比赛吗?又凭什么获奖?

比赛每年都有,老师作为引领者,有前车之鉴。盲目参加只会浪费时间与经历。


  • 学算法人不多
    • 不是必修课(数据结构没敲过什么东西)
  • 算法是有难度的
    • 需要脑子,需要思考
    • 为什么《数据结构》写代码出来这么费劲?
  • 算法学习之路非常艰辛坎坷(自学踩了很多很多坑)

社团的意义:学长和学姐为了咱学院能有更多的同学获奖,为大家分享算法学习知识与方法的平台。


补充:关于学习算法的未来?

我们的工作

  • 给大家分享经验、创建互相学习的平台
  • 未来规划:石家庄学院OJ平台

对大家的期望

  • 代码诚信(查到是真tm丢人)
  • 希望大家真的学点东西
  • 提高学习能力

算法竞赛介绍

比赛是怎么判题的

判题规则:将标准输入和输出重定向到文件,用文件输入并输出到文件中,将输出文件与标准答案进行文本比对

1
2
3
4
5
6
7
#include <stdio.h>
int main() {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", a + b);
return 0;
}
1
2
gcc a.c
./a.out < in.txt > out.txt

赛制介绍

ACM

  • 每道题提交之后都有反馈,可以看到“通过”、“运行错误”、“答案错误”等等结果,但看不到错误的测试样例
  • 每道题都有多个测试点,每道题必须通过了所有的测试点才算通过。
  • 每道题不限制提交次数,但没通过的话会有罚时,仅以最后一次提交为准。
  • 比赛过程中一般可以看到实时排名,通过题数相同的情况下按照答题时间+罚时来排名。

IO

  • 每道题提交之后都没有任何反馈,每道题都有多个测试点,根据每道题通过的测试点的数量获得相应的分数。
  • 每道题不限制提交次数,如果提交错误没有任何惩罚,仅以最后一次提交为准。(或者叫保存代码。。)
  • 比赛过程中看不到实时排名,赛后按照总得分来排名。

“暴力杯”😂

蓝桥杯

蓝桥杯是工信部组织的一项面向在校大学生的程序设计竟赛,分为软件组和电子组。

其中,软件组分为 C/C++组和 Java组、Python组,电子组分为嵌入式组和单片机组。

竞赛分为两个阶段:初赛(省赛) 和决赛。初赛时长4个小时,一共两个方向共计6个组别同时比赛。决赛时长也为4小时,分为上午和下午两个场次(随缘)。

竞赛形式为个人赛,每个人一台电脑,全程使用电脑进行答题,不能访问互联网,也不能使用 USB 等电子设备,只能访问所在考场的局域网。但是可以使用电脑的所有功能:excel、ppt、记事本、计算器。

在比赛期间会通过局域网将试题发放到你的电脑里,你需要完成题目并通过网络提交答案。

所有题目都是客观题,以选手提交答案的评测结果为评分依据。判题过程由机器完成。

题目类型

1、结果填空题

结果填空题是一类具有确定解的问题,要求你填入正确的答案。

无须写出解题过程,不限定计算的过程,你可以通过编程、在纸上计算、甚至用excel 和 Windows 自带的计算器算出答案,只要最终答案正确就能得到满分,否则得0分。

答案确保唯一性,如果你填入的格式和比赛要求的不一样也会被判为0分。

2、编程大题

编程大题具有一定难度梯度、分值不等的编程题目。这些题目的要求明确、答案客观。程序必须使用标准输入、标准输出(cin、cout、scanf、printf),以便于机器评卷时重定向。不要输出没有要求的、多余的内容,例如:“请您输入xx数据:”

要求选手通过编程,对给定的标准输入求解,并通过标准输出,按题目要求的格式输出解。题目一般会给出示例数据。

题目的考察点一般集中于对算法的设计和逻辑的组织上。理论上,选手不可能通过猜测或其它非编程的手段获得问题的解。选手给出的解法应具有普遍性,不能只适用于题目的示例数据(当然,至少应该适用于题目的示例数据)。

为了测试选手给出解法的性能,评分时用的测试用例可能包含大数据量的压力测试用例,选手选择算法时要尽可能考虑可行性的问题。

ccpc

组织形式:以组(3人/组)为单位进行竞赛(上机测试)。

比赛规则:

(1)竞赛题目为10-12题,比赛时间为5个小时。

(2)参赛队员可以携带诸如书、手册、程序清单等纸质参考资料,但不能携带电子资料,如采用U盘携带程序,线上查询等,经发现取消考试资格。

(3)试题的解答提交裁判称为运行,每一次运行会被判为正确或者错误,判决结果会及时通知参赛队伍。

(4)根据解题数目进行排名,如果多支队伍解题数量相同,则根据解题总用时加上罚时时间进行排名。总用时和罚时时间由每道解答正确的用时加上罚时时间组成。每道试题用时将从竞赛开始到试题解答被判定为正确为止,期间每一次错误的运行将被加罚20分钟的时间,未正确解答题不记时。

(5)竞赛语言包括C++、C和JAVA。

(6)每支队伍使用一台计算机,所有队伍使用计算机的规格和配置完全相同。

那我学什么语言?

C++!


我们老师说:什么语言都能写数据结构。

他没有说的是:哪个写的最顺手?

MC里面徒手也能撸石头😅


为什么不用Java?

java写代码不爽。java没有运算符重载。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 引入 HashMap 类      
import java.util.HashMap;

public class Test {
public static void main(String[] args) {
// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");
Sites.put(2, "Runoob");
Sites.put(3, "Taobao");
Sites.put(4, "Zhihu");
System.out.println(Sites);
}
}
1
2
3
4
5
6
// 定义一个map对象
map<int, string> m;

// 用数组方式插入
m[123] = "dd";
m[456] = "ff";

java在时间上有劣势。一个好的比赛会给java提供双倍或更多的时间,并且还有java标程。

java更容易TLE。比如一道1秒的题,C++标程0.5秒,java标程1.9秒。


那C语言呢?==> 所有C语言能实现的,C++都能实现

C++还带算法库、STL库

算法学习

学什么

  1. 蓝桥杯基础课-b站(看到P21就够了)
  2. y总算法基础课

补数据结构?数据结构与算法

一定要敲代码!!!

怎么学

“talk is easy,show me the code”

动手敲,AC才是硬道理!


多打真实比赛,与同学们多交流

  • 牛客OJ:小白月赛、挑战赛
  • Acwing:Acwing周赛
  • CodeForces(CF)
  • ATCode

写在最后

关于我的课

我讲的课代码 and 讲义(在我博客上有)

讲课会有录播,建议线下能来就来。但是不保证录像不翻车(经典行为:讲完发现没开录制…录完发现麦克风没插…)