随笔 - 87  文章 - 279  trackbacks - 0
<2010年8月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
2930311234

潜心看书研究!

常用链接

留言簿(19)

随笔分类(81)

文章分类(89)

相册

ACM OJ

My friends

搜索

  •  

积分与排名

  • 积分 - 214753
  • 排名 - 116

最新评论

阅读排行榜

评论排行榜

Problem A: Modular multiplication of polynomials
A题是一道模拟题,主要考察选手数组的和循环控制的运用能力。
题目要求模拟的是多项式除法,且给出了具体的运算规则,异或运算。给出f(x),g(x)两个多项式相乘,然后除以h(x)多项式,求其余数(亦为多项式)。先用两重循环将f(x),g(x)相乘,用一数组记录相乘后多项式k(x)的x^i的系数,然后做多项式除法。设被除数的最高次为x^n, 除数h(x)的最高次为y^m, 直到n<m时候循环结束。

Problem B:Checking an Alibi
这题其实就是求每个点到1号点的最短路。 然后判断每只牛所在地到1号点的需时是否小于等于M.
题目没明确说有没有重边,一般情况下是要考虑的。 在比赛时,我们认为数据中有长度为0的边,与题目中1-70000不符。但ACM就是这样,题目出问题是常有的事。在确定自己程序没错的前提下,选手们只能考经验和感觉去猜。

Problem C:The Game of Mafia
直接搜索就行了,白天和黑夜轮着搜,注意一下只剩下他自己的时候的情况就可以了。

Problem D:Multiplication Puzzle
这题是经典的动态规划。
用a[1000]表示愿数组,d[i][j]表示让第i个数与第j个数碰面(删掉他们之间的元素)的最小代价。
方程是:
 d[i][j]= max(d[i][k]+d[k][j]+a[k]*a[i]*a[j],i<k<j)
时间复杂度是O(n^3)。

Problem E:Zip
这题有两种操作A和B
对于操作A来说只要统计一下各种字母出现的次数就可以很容易得到S'了
而对于操作B来说统计一下序列S'的各种字母的出现次数,然后根据p就可以得到序列的第一个字母和第二个字母,然后根据根据第一个字母就可以得到最后一个字母
比如对于样例来说:
xelpame   7
a      x
e      e
e      l
l      p
m     a
p      m
x      e
确实了第二个字母是x,第一个字母是e,e出现第一次的时候就可以得到最后一个字母是e,
所以根据最后一个字母倒过来生成前面的序列,从对应e的最后一次出现,可以得到倒数第二个字母是l,然后对于l最后出现一次,可以确实l前面是p,然后一直填上去就可以得到原序列S=example

Promble F: Wall
F题考察的是选手基本的计算几何知识。
读懂题意后就是求凸包的周长+一个圆的周长, 求凸包可以先选取最左下角的点,然后以该点为基准对所有点作极角排序,然后就是用Graham扫描法求凸包了。

Problem G:Ouroboros Snake
这题可以用构造算法。 题目有一个限制,2^N 个数不重不漏的出现,这就是关键所在。可以想到,必然有N个零连着,这就是要求数列的开始(以后不可能有N个零连着了)。然后我们每次取后面N-1位,加0看看前是否有这N位。有,那么这一位不能是0(要不就违反了不重不漏了),只能是1。否则就加0。
但是仅仅这样并不能得出正确的答案。 怎么办呢?
想到这个构造算法的结尾必然是很多个1连着(因为加0的话,这N位在前面出现过了)。理想的情况是N个1。那么象 1000,1100,1110这些前面全是1,后面全是0的数就在首尾相接(这是一个圆环)的时候出现了。
修正办法立刻有了,就是在一开始时把象 1000,1100,1110这些前面全是1,后面全是0的数标志为已经出现过。然后用我们之前说的那种构造法一位位的确定那一位是0还是1。
经过检验,发现这样就符合要求了。

posted on 2007-04-29 01:18 阅读(647) 评论(0)  编辑 收藏 引用 所属分类: 算法&ACM

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理