模拟类型(这类题常考,看似不难,但是对于初学者来说,用代码完整地写出题意描述中的意思还是需要多加练习):
1000 1001 1020 1031 1036 1038(这题请认真读题) 1013 1014 1045 1046 1048 1050 1059 1060 1062 1063 1064 1065 1067(这个题目可以练习最简单的递归,虽然人家不让用递归) 1068(double比float的好处,可以按两种类型分别提交,看结果便知道) 1070 1075(注意细节) 1177 1179 1183 1186
字符串处理(字符串处理对于实验室做项目来说再常见不过了,因此出题往往也会偏向这部分,应该熟练掌握):
1003 1006(认真读题) 1010 1013 1019 1021 1203(这个题可用灵活的IO代替字符串你想到了吗?) 1032 1049 1055 1058 1059 1182 1192 1199 1206 1334
字符串里面的常用的简单技术有 查找 替换 字符串转换为数字 要熟练(使用库函数或者自己手写都要熟练)
数学问题:
质数的判断:1040 1047 1207(略难可不做) 筛素数法不会请百度
公约数公倍数:1056 1336 辗转相除法
矩阵的一些问题:1180 1173 1191 1193
进制转换 1026 1194 今年就考了,基础但是常见啊!
高精度计算(注意题目描述,注意前导零后续零):1198 1137
用计算机语言模拟一些数学解题的方法还是有难度的
数组的问题:
对数组的操作,简单但是很基础
1004 1018 1039 1052 1053 1057 1066 1174 1334 1363 1375 1398
栈的练习:
1019 1342
队列的练习:
1415
排序的练习:
简单的排序问题:1014 1034 1041 1178 1185 1202 冒泡也好什么也罢但是请一定会手写快排
归并排序:1004
堆排序:1416(其实不是排序题,但是要用到堆的思想请体会TLE的原因)
二叉排序: 1009 1201
字符串排序:1054 1066 1178(先后顺序决定了一些问题请体会) 1190 1195 1419
多级排序(多个关键字,学会stl的sort,并为其编写判定函数):1023 1061 1187 1196 1339 1346
链表、指针的问题:
1181 1788 1789 (后两个题不用指针的话可以用什么做你想到了吗?)
树的练习(加油吧就要胜利了):
二叉树建树、遍历:1184
二叉树概念的考察:1176
二叉排序树的建树遍历:1009 1201
霍夫曼树(不建树求权值你想到怎么做了吗):1416 1172
图(这个略微高端但都是数据结构的的东西建议做做)
图的概念问题:1027(请体会)
最短路径问题(请回忆地杰斯特拉和弗洛伊德)
Djs: 1008 1341 1406 1411
Fly:1343(这个不是经典的弗洛伊德,但可以用弗洛伊德的思想,djs也可以做请体会)
并查集的题(不懂并查集请百度): 1012(很典型的)
最小生成树:
(并查集+克鲁斯卡尔) 1017 1024 1028 1347 1417(字符串简历索引表)
并查集用数组做的时候上述题目有的可能会超时,请反思自己的并查集可否优化(提示:还是用数组,仅仅加一行即可)
图的搜索:(这类可以忽略 真的可以忽略)
宽搜:1335 1365 1404(后两题可以不做)
深搜:1012(可以用深搜但是感觉还是并查集好些,建议都练练)
简单递归:
1067 1073 1408 1205(非递归也要会)
废话两句
简单的递归和递推的区别在哪?
以斐波那契数列为例 1 1 2 3 5 8 a[n]=a[n-1]+a[n-2]
递归:由未知开始找一个到达已知的道路然后返回解不断迭代a[n]=a[n-1]+a[n-2] 直到 a[3]=a[2]+a[1]=1+1=2
递推:直接用已知求未知,先求a[3],再求a[4]直到求到所需的a[n]为止。
简单递归总是超时怎么办?
1检查边界情况是否都考虑进去,公式是否正确;
2优化 用一个数组保存已经算过的值,递归的时候会有大量的重复计算,如果加入判断条件 当这个状态计算过之后就直接返回值,会节省很多时间。(略抽象,请仔细体会,不懂也没事)
简单的DP(动态规划) 可以完全不做,没多少人能做出来的 放心吧!
序列问题:
基础:1011 1077 1112 1123(1077的升级版真的不难)
背包问题:
0-1背包:1364 1420 1123 1152 1209 1358(为什么1358也是背包?请仔细思考,当然我不排除有其他解法)
完全背包:1072 1395
废话两句:
完全背包和0-1背包求解的区别?
0-1背包从n到a[ i ]开始扫 完全背包从a[i]开始扫到n,至于为什么,如果你有能力做完上面的题,那么你肯定就懂了,如果做不明白果断不做了,没关系考察这部分的概率很小的。
不是经验的经验:
首先,拿到题,不要急于上机,首先请认真读题,不行就在纸上比划比划,大概用什么数据结构,数组要开多大,有多少变量,用什么算法要首先想明白,此外,对于数据的规模要有一个概念(10000以上的规模貌似就不能用n*n的算法了),数据的边界值,特殊值需要不需要特殊处理,太乱了就写在纸上吧。慌乱之中编出的程序有很多的逻辑漏洞,debug起来很费力,所以编码前一定保持冷静和清醒。
第二,注意变量的名字和初始化的值。变量名字是为了让你的代码有比较好的阅读性,自己记忆起来比较方便。变量的初值直接与你的程序能否正确运行有关系,在变量初始化的时候,请注意你的标记是否跟数据的边界值重合。
其次,关于代码的缩进和模块化。据说老师是会拿到上机的代码的,因此请注意你的缩进格式和模块。但是这样做的目的不仅仅是为了取悦你的老师,在自己debug的时候也会十分的方便。利人利己。
再次,说点debug的事情,有人问devcpp不能调试什么的巴拉巴拉的。其实在调试的时候,可以将自己的中间变量输出,如果你的代码符合我说的上一点,那问题出在哪就会十分的明了。切忌提交的时候要把这部分加上注释或者直接去掉,不然就纠结了。
最后,如果你决定做一道题,就一定要将它ac,任何什么“我会了”,“我知道怎么做就行了”都没有ac了来的实在。
附赠一些我经常犯的错误:
re: 数组是不是少了一位 下标越界情况是否排除?(比如a[-1])
pe: 空格是不是少了多了?
Wa: 数据是多组还是一组 大小写 空格问题
OLE:最外重是否忘记了scanf()==xx 测试的//是不是没有加上
TLE:最外重是否忘记了scanf()==xx
=与==的区别
输入的时候&别忘了!!!
for()是否多加了; eg: for();
memset(a,0,sizeof(0)) (自己看看这是哪不对,给数组清零)
图的自环 重边问题
是不是有遗忘了的数组未初始化
数据定义的类型
1000 1001 1020 1031 1036 1038(这题请认真读题) 1013 1014 1045 1046 1048 1050 1059 1060 1062 1063 1064 1065 1067(这个题目可以练习最简单的递归,虽然人家不让用递归) 1068(double比float的好处,可以按两种类型分别提交,看结果便知道) 1070 1075(注意细节) 1177 1179 1183 1186
字符串处理(字符串处理对于实验室做项目来说再常见不过了,因此出题往往也会偏向这部分,应该熟练掌握):
1003 1006(认真读题) 1010 1013 1019 1021 1203(这个题可用灵活的IO代替字符串你想到了吗?) 1032 1049 1055 1058 1059 1182 1192 1199 1206 1334
字符串里面的常用的简单技术有 查找 替换 字符串转换为数字 要熟练(使用库函数或者自己手写都要熟练)
数学问题:
质数的判断:1040 1047 1207(略难可不做) 筛素数法不会请百度
公约数公倍数:1056 1336 辗转相除法
矩阵的一些问题:1180 1173 1191 1193
进制转换 1026 1194 今年就考了,基础但是常见啊!
高精度计算(注意题目描述,注意前导零后续零):1198 1137
用计算机语言模拟一些数学解题的方法还是有难度的
数组的问题:
对数组的操作,简单但是很基础
1004 1018 1039 1052 1053 1057 1066 1174 1334 1363 1375 1398
栈的练习:
1019 1342
队列的练习:
1415
排序的练习:
简单的排序问题:1014 1034 1041 1178 1185 1202 冒泡也好什么也罢但是请一定会手写快排
归并排序:1004
堆排序:1416(其实不是排序题,但是要用到堆的思想请体会TLE的原因)
二叉排序: 1009 1201
字符串排序:1054 1066 1178(先后顺序决定了一些问题请体会) 1190 1195 1419
多级排序(多个关键字,学会stl的sort,并为其编写判定函数):1023 1061 1187 1196 1339 1346
链表、指针的问题:
1181 1788 1789 (后两个题不用指针的话可以用什么做你想到了吗?)
树的练习(加油吧就要胜利了):
二叉树建树、遍历:1184
二叉树概念的考察:1176
二叉排序树的建树遍历:1009 1201
霍夫曼树(不建树求权值你想到怎么做了吗):1416 1172
图(这个略微高端但都是数据结构的的东西建议做做)
图的概念问题:1027(请体会)
最短路径问题(请回忆地杰斯特拉和弗洛伊德)
Djs: 1008 1341 1406 1411
Fly:1343(这个不是经典的弗洛伊德,但可以用弗洛伊德的思想,djs也可以做请体会)
并查集的题(不懂并查集请百度): 1012(很典型的)
最小生成树:
(并查集+克鲁斯卡尔) 1017 1024 1028 1347 1417(字符串简历索引表)
并查集用数组做的时候上述题目有的可能会超时,请反思自己的并查集可否优化(提示:还是用数组,仅仅加一行即可)
图的搜索:(这类可以忽略 真的可以忽略)
宽搜:1335 1365 1404(后两题可以不做)
深搜:1012(可以用深搜但是感觉还是并查集好些,建议都练练)
简单递归:
1067 1073 1408 1205(非递归也要会)
废话两句
简单的递归和递推的区别在哪?
以斐波那契数列为例 1 1 2 3 5 8 a[n]=a[n-1]+a[n-2]
递归:由未知开始找一个到达已知的道路然后返回解不断迭代a[n]=a[n-1]+a[n-2] 直到 a[3]=a[2]+a[1]=1+1=2
递推:直接用已知求未知,先求a[3],再求a[4]直到求到所需的a[n]为止。
简单递归总是超时怎么办?
1检查边界情况是否都考虑进去,公式是否正确;
2优化 用一个数组保存已经算过的值,递归的时候会有大量的重复计算,如果加入判断条件 当这个状态计算过之后就直接返回值,会节省很多时间。(略抽象,请仔细体会,不懂也没事)
简单的DP(动态规划) 可以完全不做,没多少人能做出来的 放心吧!
序列问题:
基础:1011 1077 1112 1123(1077的升级版真的不难)
背包问题:
0-1背包:1364 1420 1123 1152 1209 1358(为什么1358也是背包?请仔细思考,当然我不排除有其他解法)
完全背包:1072 1395
废话两句:
完全背包和0-1背包求解的区别?
0-1背包从n到a[ i ]开始扫 完全背包从a[i]开始扫到n,至于为什么,如果你有能力做完上面的题,那么你肯定就懂了,如果做不明白果断不做了,没关系考察这部分的概率很小的。
不是经验的经验:
首先,拿到题,不要急于上机,首先请认真读题,不行就在纸上比划比划,大概用什么数据结构,数组要开多大,有多少变量,用什么算法要首先想明白,此外,对于数据的规模要有一个概念(10000以上的规模貌似就不能用n*n的算法了),数据的边界值,特殊值需要不需要特殊处理,太乱了就写在纸上吧。慌乱之中编出的程序有很多的逻辑漏洞,debug起来很费力,所以编码前一定保持冷静和清醒。
第二,注意变量的名字和初始化的值。变量名字是为了让你的代码有比较好的阅读性,自己记忆起来比较方便。变量的初值直接与你的程序能否正确运行有关系,在变量初始化的时候,请注意你的标记是否跟数据的边界值重合。
其次,关于代码的缩进和模块化。据说老师是会拿到上机的代码的,因此请注意你的缩进格式和模块。但是这样做的目的不仅仅是为了取悦你的老师,在自己debug的时候也会十分的方便。利人利己。
再次,说点debug的事情,有人问devcpp不能调试什么的巴拉巴拉的。其实在调试的时候,可以将自己的中间变量输出,如果你的代码符合我说的上一点,那问题出在哪就会十分的明了。切忌提交的时候要把这部分加上注释或者直接去掉,不然就纠结了。
最后,如果你决定做一道题,就一定要将它ac,任何什么“我会了”,“我知道怎么做就行了”都没有ac了来的实在。
附赠一些我经常犯的错误:
re: 数组是不是少了一位 下标越界情况是否排除?(比如a[-1])
pe: 空格是不是少了多了?
Wa: 数据是多组还是一组 大小写 空格问题
OLE:最外重是否忘记了scanf()==xx 测试的//是不是没有加上
TLE:最外重是否忘记了scanf()==xx
=与==的区别
输入的时候&别忘了!!!
for()是否多加了; eg: for();
memset(a,0,sizeof(0)) (自己看看这是哪不对,给数组清零)
图的自环 重边问题
是不是有遗忘了的数组未初始化
数据定义的类型