竞价抢车位
算法分为两个模块,第一个模块是典型的计算几何问题,给定一个简单多边形,计算包含其中(不包括边上的点)的整点个数。第二个模块是给定车位数(等于第一个模块计算结果的整点数),求出价。第一个模块的算法没有错误,虽然用到了double的比较,但是,没有出问题(这并不是什么好运,因为我也花了大量时间测试这个模块)。第二个模块虽然没有用标识的方法把两个独立数组整合到一起,但正常情况下也不会有问题,但是有一个极端的输入下会出现问题,当已经出价的当中出现同一价位的分开输入且准备出价的当中也有相同价位时(比如已经出价列表包含318 a,318 b,且未出价列表中包含318 c,abc都不为零),这个时候,错误的算法会假设输入中不可能有两个相同价位的重复,从而出错。
这道题出现的问题给我的启示是:这题目太阴了,不说明输入有没有排序不论,还出现这种同一个价位分两行来写的愚昧情况;但是,事实是,你毫无选择,你只能更加仔细地考虑边界输入。
本来可以一次AC的,这道题,败在边界的输入上。
狄多公主圈地的故事
这道题的算法可以是变相穷举法,找到所有可能的圆心然后一一测试。算法是没有漏洞的,能解决的情况比题目限定的输入条件(数目位置为整点)还要广阔。算法虽然没有漏洞,但是,致命的问题出在double的比较上,double经过开根号,除法等运算,本来精确的数据变得失真,在比较的时候出现偏差。这个错误是在我用群举法又写了一个测试程序段后发现的。通过加入校正量,可以允许在double相等比较的时候存在一定误差。
本来可以一次AC的,这道题,败在边界的情况上。
总结
在OJ上做题一定要小心边界输入与边界情况,不要以为输入不会愚蠢,不要以为double精度就够用了(即使在处理不大的数据)。
如果你在debug,请耐心冷静的分析,要相信找到bug与修复bug的时候都会是开心的。