北邮-上机题型总结-九度练习

又到了一年的上机的时节,如果你之前做过很多ACM你可以完全忽略此贴。 
  
本帖子面向基础薄弱,或者跨考学生,其实是我当时在考研专刊里面写的,因为大家好多都不看考研专刊,于是就拿出来了。。。因为是之前被放在考研专刊附赠的里面。所以怕大家看不到。所以拿出来了。。。 
  

下面面我给出我自己总结的一些题型的分类,可能不是很完全正确,仅供参考:    
     
模拟类型(这类题常考,看似不难,但是对于初学者来说,用代码完整地写出题意描述中的意思还是需要 
多加练习):    
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)) (自己看看这是哪不对,给数组清零)    
图的自环  重边问题    
是不是有遗忘了的数组未初始化    
数据定义的类型    
  
最后一句话:[size=8]上机是目前屌丝逆袭的唯一机会[/size] 
-- 

你可能感兴趣的:(北邮-上机)