不够明白的 待做的
以下讲解不够详细之处请参照源码
3:面积用三角划分计算,重心根据各三角形的重心和用面积加权求得
5:暴力匹配,或使用string.h的find()函数(或std::string::find()),或将二进制串转化成整数比较,或任何其他串匹配算法(KMP,rabin-karp)
10:DP,记录每坐标点作为线路终点时当前线路长度,初始每坐标点长度置1,状态转换方程f(x,y)=max{f(x,y),{(x,y)的邻接点中比(x,y)地势高的邻接点的长度值+1}},迭代至收敛,遍历,输出所有点中最大长度。可使用滚动数组节省空间
20:BFS(DFS需注意剪枝避免TLE)
21:BFS(以三个杯子的水容量为状态,以一次倒水为状态转换)
23:归纳可得N%(M+1)?"Win":"Lose"
25:题目似乎有问题,考虑following 10的时候报错,不考虑就对了
26:规模不大,可打表做(如规模太大用rabin-miller判素)
30:枚举最后一个到达的湖,对于每种情况先扣除所有旅程时间,在剩下的时间中每次选取鱼最多的湖钓鱼
32:递归
35:数据结构经典题
37:最少添加数=strlen(s)-lcs(s,reverse(s))
38:最小生成树,Prim/Kruskal
42:无向图Euler路径存在性判定
43:递归(《编程之美》1.16“24点游戏”)
44:从第一个变量开始持续加和,每次加和完后更新最大子串和,若遇当前子串和为负则从下元素开始重新计算
45:大整数乘法
46:log(n)乘法:n为奇数时a^n=a*a^(n-1),偶数时a^n=(a^(n/2))^2
49:0-1背包问题,DP求解
52:找循环,注意n最大可取99999,因此int32表示n^2不够用(最大4e9),需int64
这题的测试程序只找0字循环,一开始写了可找6字形循环的WA了,给一个6字循环的例子(n=2,k=2):
2 4 8 16 32 64 28 56 12 24 48 96 92 84 68 36 72 44 88 76 52 4
^<--------------------------20----------------------------|
但如果是找0字循环的话,因为永远都不会回到2,所以应该输出-1. 0字循环则简单得多,最多找10^k次即可(因为最后k位取值最多10^k种,因此如果存在0字循环,则最长循环的长度为n,n^2...n^k,即k)
55:每次取最小的两堆合并
59:先检查是否为无解输入,固定第一人在第一位置一路向左(或者一路向右,无所谓)安排座位,计算安排后的新位置每个人与原位置的差值i,统计每个i值的出现次数,计最大次数为m,则该排位方案需移动c=n-m人,计算所有排位方案的c值,输出最小c值
61:多维DP http://blog.csdn.net/epiker/article/details/7482875 网络流 http://acm.nyist.net/JudgeOnline/articles/?p=48
66:k=x*y/(y+x)且x,y,k均为整数,令y<=x<=k*(k+1)
67:向量公式或海伦公式均可
71:尾头(先取尾后取头)贪心
75:闰年判断
76:递推公式f(1)=0,f(2)=1,f(3)=2,f(n)=f(n-1)+f(n-2)
78:点集凸包问题
79:DP,最长单调递减子序列。其实我觉得这题有问题。根据题设应该是求最长单调非递增子序列,但按此要求做WA,改为单调递减后AC
80:TBD
81:DP,按行位压缩表示地形、部署方案,位运算判断部署方案与条件是否冲突,可使用滚动数组节省空间
82:DFS
83:线段相交判别。可能线段:从所有可能的边点至宝藏所在点,其中边点是位于迷宫边界上两个相邻墙端点中间的任意一点(可直接取中点)
84:取决于1..n中因子5的个数,所以为n/5(5,10,15,20,25...的首个因子5的个数)+n/25(25,50,75,100,125...的第2个因子5数)+n/125(125,250,500...的第三个因子5数)+n/5^i(5^i,2*5^i,3*5^i...的第i个因子5数),其中i为使得n>=5^i最大的取值
86:hash统计
87:多维DP
88:f(n+1)=2f(n)+1,S(n)=2^n-1
89:递归,从最大的碟子开始考虑递归分解
90:递归分解:f(x)=1+h(x-1,1)+h(x-2,2)+...+h(x-x/2,x/2),其中h(x,y)为对x的分解方案数,这些方案均满足条件:对于每个组成分解的数n,均有n>=y. h(x,y)的递归展开式:h(x,y)=1+h(x-y,y)+h(x-(y+1),y+1)+...+h(x-x/2,x/2)
91:n<1000000可知仅需考虑至9!=362880,若1!..9!各占一个二进制位,则0~2^9-1代表了所有组合情况(共512种),穷举可能结果后存入表中,直接查表输出结果
92:沿边缘扫描,遇非0格子BFS置0。一种比较tricky的方法是在最外围加一圈1然后从(0,0)开始BFS
93:模拟
94:模拟,保留所有烟屁股,直到所剩烟屁股<k时输出已抽香烟支数
95:hash统计
99:将输入看成有向图,顶点是字母,边是单词,边从首字母指向末字母,则单词拼接问题转化为寻找有向图中Euler路径的问题。直接DFS找会TLE,按照连通性判别->欧拉路径/回路存在性判别->DFS寻找最小字母序Euler路径可AC. 启发:对于不一定存在解的题目,可通过解存在性的判定进行搜索剪枝,本体若给定输入不存在解,则必须DFS所有可能才能判定不存在,因此TLE
100:逐位统计