回 帖 发 新 帖 刷新版面

主题:第三十次编程比赛第一题的结果

下面我公布第三十次编程比赛的结果:
 maobingwen 5楼:不能通过编译。
 shijizhisheng 10楼  不能通过编译。
 天边蓝 12楼  OK。
 sllone 7楼   OK。
通过编译的两个程序,都是用了两重循环,
而天边蓝的程序不需要 每次SQRT显然要好

一点。
因此  我宣布 本次比赛结果(第一题)冠军

为天边蓝!
 希望你组织下一次比赛的第一题。

回复列表 (共19个回复)

沙发

请原谅我不能直接贴出答案。
这题其实关键是使用求凸包算法。
求凸包算法复杂度为O(n*logn),得到在凸包上的顶点d个。再进行d^2的求最大距离。
d在随机数据情况下约为4*n^0.5,在n为30000时,d约为700。
整个程序的复杂度为O(nlogn + d^2) = O(nlogn + 16n),约为624313。

板凳

没关系的,不贴出来也好。
因为像你上面说的那样,贴出来了估计我也看不懂。


   你一直是我在论坛的偶像。
不过我发誓我要追上你的。

3 楼

汗...我很菜的。
我不能贴是因为自己写会写错:)

4 楼

to iAkiak
我自己想了一下,我只是想到要用两重循环,
不过由于帖子没有隐藏,我见到的和我想到的几乎一模一样,
另外最近也比较忙,因此我就没写出来.可是老大你既然想到凸包算法怎么不写啊.
凸包算法我连听都没听过呢,不然的话我可又长见识了.不写出来,那就讲讲伪代码之类的可以么?

5 楼

凸包算法

应该就是求“凸多边形”--不过,我没有想到O(n*logn)复杂度的算法...

6 楼

严重同意ckeryradish 4楼的说法

7 楼

求凸包算法。
什么是凸包:直观的说,平面上n个点,用橡皮筋围起来,橡皮筋接触到的点构成凸包。
选最低的点O(n),计算它到所有其他点的矢量的方向O(n),按逆时针方向对其他点排序O(n*logn)。
使用栈,记录凸包上的点。
最低的点一定在凸包上。压栈
排序得到的第一个点也一定在凸包上。压栈
现在保证栈内至少2个点。
对其余的点依次遍历。
如果栈顶点A到下一个点B的矢量方向相对栈顶2点矢量方向是逆时针的,那么新顶点B可以加入栈。(它可能是凸包上的点)反之,则栈顶点A必然不是凸包上的点,弹出A
继续判断栈顶点直到B压栈或者栈内只剩余2个顶点为止(此时B点也压栈成为新栈顶)。
最后一个点加入后还需要尝试加入最低点以排除末尾的多余内点。
判断完所有顶点后,栈内点依次为凸包的逆时针顶点。这个过程为O(n)(注意,虽然有加入顶点和排除顶点,但一个顶点最多被加入和排除各1次)

总复杂度最高的地方就是排序O(n*logn)

8 楼

形象,方便理解!


凯凯兄厉害!

9 楼

[em3]
看不太懂
[em8]

10 楼

即使用了凸包算法,但是在最坏的情况下,可以专门出数据,还是O(n^2).

我来回复

您尚未登录,请登录后再回复。点此登录或注册