-
SCOI2011第一试
当天考试得分120分。
-
第一题是差分约束系统。期望得分100分,实际得分80分。
错因:
-
没有特殊判断输入数据矛盾的情况,导致超时。
-
此题要求求出最小解,而我用的是经典差分约束系统(求最短路的方法),此方法只能求出最大解,所以出错。(正确方法是将所有边都建成正边,然后求一次最长路。)
-
没有判断求最长路时存在的负环,所以导致程序死循环。
总结:
-
今后遇到差分约束系统时先要分析清楚到底是求最大解还是最小解,若求最大解则建负求最短路,反之建正边求最长路。
-
要充分考虑有环的情况。
-
-
-
第二题是基于连通性的状态压缩动态规划。期望得分40分,实际得分40分。
总结:不会做一定要骗分!比如这道题就可以用简单的动态规划过30分+特殊数据处理10分。(若还能写出搜索来,则还可以得20分。)
-
第三题至今不会,据说是一道数据结构或者线性规划类型的题目。
-
-
SCOI2010第一试
当天考试得分150分。
-
SCOI2009第一试
当天考试得分200分。
-
第一题是朴素枚举题。期望得分100分,实际得分100分。(之前做过。)
总结:不可盲目优化,即使要优化,也要使用对拍验证。
-
第二题是数论+搜索。期望得分100分,实际得分100分。(之前做过。)
总结:
-
记忆化搜索比直接递推常数更大,所以能不使用记忆化搜索就尽量不使用记忆化搜索。
-
应当优化质数表生成器,使得其达到线性复杂度。
-
附关键代码:
top = 0; for (int i = 2; i <= n; ++i) //n为枚举范围。 { if (!tag[i]) p[top++] = i; for (int j = 0; j < top && p[j] * i <= n; ++j) { tag[i* p[j]] = 1; if (i % p[j] == 0) break; } }
-
-
第三题是一道动态规划。期望得分20分,实际得分0分。考试时本想直接写出完美算法,但殊不知出了差错连朴素的分都没得到。
总结:写程序时要想好每一步,防止各种可能的错误,先想好,再仔细地写。
-
-
APIO2010
当天考试得分67分。
-
第一题是斜率优化的动态规划。期望得分50分,实际得分30分。
总结:
-
这类问题的决策一般都是单调的,所以使用决策单调性可以降低很大一部分枚举量。
-
斜率优化动态规划一定要对拍。
-
-
第二题是树型动态规划。期望得分30分,实际得分37分。
总结:
-
K=1的情况很简单,一定要得到这一部分分。
-
看到这类问题就要想到树型动态规划,充分思考,想出一个无后效性的状态出来。
-
-
第三题是计算几何。期望得分30分,实际得分0分。
错因:(未找出。)
总结:
-
计算几何问题都要考虑误差。一些简单的无递归的多次被调用的函数可以使用内联或者宏来实现,节约时间。
-
对于极角排序(使用叉乘作为比较函数)等在比较中不具有传递性的排序不能使用sort,而是使用qsort,否则出错。
-
-
-
APIO2009
当天考试得分110分。
-
第一题是动态规划。期望得分无法估计,实际得分46分。
错因:没有思考清楚反例。
总结:
-
题目中具体到了分成3个正方形很特殊,应注意具体分析。
-
对于这类似的某一信息很特殊的动态规划问题,该信息可能为整道题的突破口。
-
-
第二题是倍增思想的应用加平衡树优化,期望得分50分,实际得分0分。
错因:
-
虽然运用了第三题的思路(找最长路),但是没有注意到此题找最长路不能用Dijkstra算法来求解。
-
在找最小字典序方案时,没有注意把各个区间按照从小到大的顺序排序,从而造成答案错误。
总结:
-
一定要想办法拿到部分分。
-
牢记Dijkstra算法不能用来找含正权图的最长路或者含负权图的最短路。
-
-
第三题是强连通分量加最长路。期望得分84分(Windows环境下)或100分(Linux环境下),实际得分64分。
错因:
-
没有注意到此题找最长路不能用Dijkstra算法来求解。
-
重新建图时没有判重,导致超时。
总结:
-
建图时若是稀疏图则考虑判重。
-
牢记Dijkstra算法不能用来找含正权图的最长路或者含负权图的最短路。
-
-
-
ZJOI2010第一试
当天考试190分。
-
第一题是数字统计问题,期望得分100分,实际得分100分。
总结:
-
这类问题要反复思考,思考周密过后再下结论。
-
将复杂问题简单化,分步思考(如这道题先考虑数字1~9的统计最后再考虑0)。
-
-
第二题是最大流加最小费用流,期望得分无法估计,实际得分90分。
总结:
-
遇到不会做的题,一定要大胆思考,从合理性、特殊性等方面思考。
-
由于网络流所建的图较复杂,所以先将原来图中到底有哪些边记录下来再重新建图。
-
-
第三题是线段树优化的动态规划,期望得分30分,实际得分0分。
总结:
-
宁愿提交朴素的程序也不要交有错的程序(除非这个有错的程序能够保证相当的正确率)。
-
仔细琢磨以下题目,这道题还是没有想象中的那么困难(至少朴素程序可以在一定时间内想出来,甚至是稍加优化的程序)。
-
-
-
PKWC2009第一试
当天考试200分。
-
第一题是朴素的搜索。期望得分100分,实际得分100分。
总结:
-
这类问题不能将其想得过于复杂,否则不仅浪费时间并且有可能出错。
-
要注意考虑特殊情况(如这道题中的不同人的视线可以交叉)。
-
-
第二题是状态压缩的搜索。期望得分100分,实际得分60分。
错因:字典序弄错,如二进制数01、10、11分别对应A、B、AB,并不是字典序的顺序。
-
第三题是状态压缩型动态规划。期望得分无法估计,实际得分40分。
总结:
-
虽然此题题目中说了“100%”的数据满足……但是并不一定代表所有数据的规模都一样大,所以搜索等方法还是值得一试。
-
多次计算同一值的情况下可以先预处理减少运算次数。
-
散列表中能不用开散列就尽量不用开散列。
-
-
-
ZJOI2009第一试
当天考试140分。
-
第一题是找规律。期望得分无法估计,实际得分100分。
总结:不会做千万不能放弃,比如这道题规律非常简单,不要被数据规模(n<= 100)所吓倒。
-
第二题是二分图匹配。期望得分100分,实际得分0分。
错因:题目中说到“注意如果第i个人不是在校学生,那么这个位置上的数是一个随机的数,你应该在读入以后忽略它”,我把这个随机数读入之后,没有排除这个信息的干扰,导致全错。
总结:
-
遇到这种含有干扰信息类型的问题应当仔细琢磨,排除一切因干扰信息造
成的错误。
-
自制测试数据一定要考虑全面,若存在性问题则需要考虑存在和不存在两种情况。
-
-
第三题是博弈论。本题未作为考试题目。
-
第四题是状态压缩+动态规划+容斥原理,期望得分40分,实际得分40分。
总结:不能想出完美算法时,能朴素就朴素。
-
/****************************************************************\
-
double类型不能使用%d格式输入或输出,其它类型类似。
-
全局变量很危险,不到万不得已千万不得使用。
-
动态规划在以下地方容易出错:边界条件,枚举范围,枚举顺序以及结果的取缔范围。
-
永远都要记得输样例。
-
矩阵乘法计算时应确保每一步都取余。
-
对实数取绝对值必须使用fabs()而不是abs()。
-
注意“\”的续行效果,不仅仅是在宏定义的行尾,在单行注释符号”//“的末尾也能起到续行的作用。
-
abs()函数中不能跟64位整数,如果要用,则应该用std::abs()。
-
记得检查数组下标越界。
-
斜率优化时要注意斜率不存在的情况。
-
斜率优化正推不行时可以倒推。
-
写datamaker一定要记得初始化随机数种子srand(time(NULL))。
-
进考场前先写一个测试随机数的程序(这个很重要),再打框架。
-
光是指针符号“*”并不能起到“变参”的作用,需用“*&”符号,也即指针也要传引用。
-
注意宏中隐藏的错误(如展开后计算多次)。
-
注意isdigit(),isalpha()等函数在使用时一定要加上“string”头文件。(注意不是“cstring”。)
-
Dev-C++的撤销功能有缺陷,慎用。
-
可以采用“局部注释法”,尝试将每个含有关键判断的语句逐个注释掉,看对结果是否有影响。
-
在求模次数较多时,用减法较优。但若被除数远远大于除数,用除法较优。
\****************************************************************/
数据规模 | 时空复杂度 | 备注 |
---|---|---|
N <= 10,15, ... | O(N!), O(2N),... | 无疑是搜索,要考虑剪枝。 |
N <= 20,... | - | 考虑状压DP。 |
N <= 30,50, ... | O(N4),... | - |
N <= 80,100, ... | O(N3),... | - |
N <= 500,103, ... | O(N2),... | 若是区间DP,则考虑四边形不等式。 |
N <= 104,105, ... | O(N·log N),... | 若是线性DP,则考虑单调队列、斜率优化。 |
N <= 107,... | O(N), ... | - |
N <= 108以上 | O(log N), ... | 一般是数学问题。考虑矩阵乘法,容斥原理等优化。 |