WHU2008校赛决赛B题D题和J题解题报告
5 评论7次阅读2008.04.01 11:52; 作者:Felicia
amath
B题
此题非常简单,Snoopy在澡堂洗澡的时候想出的题目,非常具有武大生活气息。主要代码是一个常量数组,表示`0-9`这些数字分别对应哪些LED点亮。做的时候先读入mask,然后把每一位读进来之后与上mask,并和常量数组与上mask相比,若相等,就说明是对应的。因此可以求出每一位可以对应多少个数字。最后把这些数乘起来输出。
D题
对每个星星按照高度排序之后,可以转化为二维平面上的有叠放次序的圆的覆盖问题。
先考察一下这个问题的性质。
性质1:任何一个圆都覆盖了一个闭区域。
性质2:对于任意一个点,覆盖它的最上面的那个圆,一定是可见的。
性质3:如果一个圆不可见(它被完全覆盖),那么它的边界是被完全覆盖的。
性质4:`n`个圆最多有`2(n-1)^2`个交点,这些交点把`n`个圆分成最多`2(n-1)^2`条小圆弧。
性质5:对于每个小圆弧,要么它全被覆盖,要么它全不被覆盖。
根据性质1和性质2,问题转化为恰当地找出一些点,对于每个点,把覆盖它的最上面的圆标记为可见。
根据性质3,这些点一定在所有圆的边界集合内。
根据性质5,所有小圆弧构成边界集合。每个小圆弧上只要任意取一个点就能代表整个小圆弧(边界)。不妨取中点。
至此得到算法:取所有小圆弧的中点,对每个点找到覆盖它的最上面的圆。
根据性质4,最多取`2(n-1)^2`个点。对每个点找到覆盖它的最上面的圆,需要`O(n)`次运算。
总复杂度是`O(n^3)`。
其实此算法还有冗余,有些内部小圆弧可以不用考虑,但是我没想出怎么优化。有谁知道更好的算法,请联系我。blog(GCCFeli.cn)留言或者qq交谈或者发邮件可以。
J题
此问题的推广应用非常广泛,包括三维渲染中不可见面的消隐,三维凸包的构建等等……
此题的核心问题是:对于一个面f和一点`p`,判断`p`是否可以看见f。
做法很简单,先求`f`的法向量`f_n`,再连接`f`上任意一点和`p`做一个向量fp,`f_n * p >= 0`就表示`p`可以看见`f`,`f_n * p = 0`表示`p`在`f`上,`f_n * p <= 0`表示无法看见。
附出题和judge心得:
很多队惧怕计算几何,其实计算几何并不可怕,比如J题,敢做的话一定能轻松做出。D题细细想上一段时间,也不难做出(我有两种解法,另一种在赛后点评上说了),我的代码不到100行,比我写的J题代码要短(可能是因为J题代码是按照三维凸包的代码改的吧)。且eps已经在题目里说明了,不必自行估计,避免了精度问题。
做judge是一件很好玩的事情。看着提交上来的程序出现的各种各样的错误,就为他们着急,尤其是大小写搞错,或者打错符号,或者忘记去掉调试信息的。这些程序改改立刻就能过,但是我只能判wa。有的队这样wa之后,等了很久才发现错误,这是不应该的。空闲的时候我也会跑去送气球。校内的队伍过了我出的题的时候,我总是非常高兴,忍不住跑过去送气球。
这次校赛给了GCC一个机会,让我们能够站在出题者和裁判的角度去感受ACM/ICPC比赛,对我们来说是一个全新的体验o(∩_∩)o
校赛结束了,World Finals要到了,我们要加油!
endamath

zzningxp | 1F
四月 1st, 2008 at 17:35
G题的结题报告在哪?
zzningxp | 2F
四月 1st, 2008 at 17:49
G题的解题报告在哪里找到?
Felicia | 3F
四月 2nd, 2008 at 14:04
在珞珈山水 bbs.whu.edu.cn 上可以找到
xiaoze | 4F
八月 24th, 2008 at 14:14
有F题的解体报告么?就是那个经典的kth number
Felicia | 5F
八月 25th, 2008 at 10:54
去 bbs.whu.edu.cn 看看?这个是mmd出的题