题目一:Factorials
题目大意:求n!的最后非0位。
算法:模拟
1.2的因子的个数显然比5多很多;
2.可以预先根据5的个数估计出末尾0的个数,然后只需保存多余2的个数,去更新末位的值;
3.实际做的时候没有想到上述方法,而是鬼使神差地想到保存末5位,但是无法证明!
题目二:Stringsobits
题目大意:在所有长度为N的1的位数不超过K的二进制数中(包含前导0),求出第I大的数
算法:DP
状态转移方程:S[I][J]表示长度为I用1的个数不大于J的二进制数的个数;
S[I][J] = S[I-1][J]+S[I-1][J-1],很像C(A,B)的递推公式啊!
初始条件:s[0][i] = 1,1 <= i <= K
还有一点要注意的是2^31 超过LONGINT的表示范围,可以用UNSIGHED LONGINT,读入格式scanf("%u", &a)
题目三:Spinning Wheels
题目大意:有若干个有缺口的转动着的轮子,转的过程是离散的,以时间1为基本单位,求出什么时候在某处光线可以通过。
一种思路是状态仍是离散保存,只保存起始点和末端点,用时间更新初始坐标,判断的时候考虑到有些段可能跨越360的临界,就要分别判断是在360内还是360外。
特别注意:只要有一点缝隙,光就可以过!
还有一种思路是用BOOL来保存状态,效率相对较低;
题目四:Feed Ratios
1.由于数据比较小,可以BRUTE FORCE,关键在于3点共线判断的方法,不推荐用斜率的方法去做,最好用向量的方法去做;
2.本题可以用Cream方程组的知识去做,以下是USACO官方的解答
题目五:Magic Squares
算法:BFS
1.康托展开(Cantor),给出一个1-N的排列,求1-N的全排列字典序中的位置;
2.康托展开的逆运算是给出位置,找到这个排列。
3.这道题要用Cantor + Hash可以有效节约空间
题目六:Sweet Butter
算法:SPFA
题目大意:给出一张图,有一些人在某些点,求出最小的集合代价。
由于这张图边比较稀疏,用邻接表存好,且访问起来更方便;
用SPFA分别求出任意两点间的最短路。
很好,这一个星期的任务完成了,不过接下来还要奋战学校的OJ啊!加油!