题目:传送门
解答:直接暴力求解肯定会超时。此题核心就是求出来最近的一对点之间的距离,即最近点对算法。
简要来说就是利用分治的思想,左半边的最小距离,与右半边的最小距离比较,得到一个mindist。再遍历分界线左右 mindist 范围内点的间距,取最小值。
这样,需要暴力的只有分界线周围的点。但是我第一次提交版本还是超时。询问之后是因为优化不够,写在trick中。
这里一些trick:
- 分界线:不一定是距离上的等分,根据 x 轴位置排序后进行数量上的等分(取最中间的点)左右更好;
- 取中点暴力时,切记不要与自身比较(距离为0);
- 除非有 string,不然不要用 cin,scanf 会快上很多;
- 这个我一直很想吐槽……数据精度,做 oj 就别用 float 了,直接上 double