关于圆内外2n+1个点的分配
假设平面坐标上有2n+1个点,如何作一个圆,使得恰有n个点在圆内,n个在圆外,1个在圆上。
分析: 假设已经找到这个圆,那么在该圆内任选一条弦,且满足该弦与不在圆上的另外2n个点中的任意一个均不共线,则该弦和这2n个点可以构造2n个三角形。由于在圆外的点与弦所构成的三角形中弦的对角必定小于与该弦同方向的圆周角;同理,在圆内的点与弦所构成的三角形中则呈大于关系;而在圆上的点与弦的关系是或者共线(即0角度),或者为圆周角。
根据以上分析,可以采用如下方法可以找到这个圆。但直接使用如上方法,非常复杂。下面首先对数据进 行预处理。这2n+1个点向x正向和y正向坐标轴移动(即是从左下向右上移动),直至最左下的点移动到原点O处,这时另外2n个点要么在x轴正半轴上,要 么在x轴上方。因此过O点可以找到一条直线,使2n个点位于它的同一侧(且不在线上),在该直线上任取一个点P(与O点不重复),以OP为边,以线外2n 个点为第三个顶点可以构造出2n个三角形。然后对所有三角形中OP的对角(共2n个)进行排序并判断:若第n个角不等于第n+1个角,则任取一个在区间 (第n,第n+1)这两个角度之间的角度(设为k), 则以OP为弦且同方向圆周角大小为k唯一确定一个圆,该圆即满足条件。若第n个角度与第n+1个相等,则调整P点的位置(在程序里易实现),重新排序判断 直至求得可行解。
关于该方法的证明和程序后续可能会提供。这里参照了以前一个中学竞赛的题目,以及javaman所提的通过将所有点移动到同一边以简化算法的idea,在此表示感谢。