USACO 3.2 分析

 题目一:Factorials

题目大意:求n!的最后非0位。

算法:模拟

1.2的因子的个数显然比5多很多;

2.可以预先根据5的个数估计出末尾0的个数,然后只需保存多余2的个数,去更新末位的值;

3.实际做的时候没有想到上述方法,而是鬼使神差地想到保存末5位,但是无法证明!

 

题目二:Stringsobits

题目大意:在所有长度为N的1的位数不超过K的二进制数中(包含前导0),求出第I大的数

算法:DP

扫描二维码关注公众号,回复: 12261872 查看本文章

状态转移方程: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啊!加油!

猜你喜欢

转载自blog.csdn.net/zjsxzjb/article/details/6210145
3.2