CF257C题解

题面

Description:
平面上有 \(n(1\leq n\leq 10^5)\) 个点。你要从原点引出两条射线,将平面分成两个部分,保证其中一个部分覆盖了所有的点。问这个部分与原点所夹的角的最小度数。


正难则反。我们可以把问题转化为求一个部分不包含所有的点,问这个部分在原点的角度最大值。
用贪心的思想,这个部分的两条射线肯定要经过点,否则一定不是最优。而且,这两个点之间不能有任何点。所以,我们可以把点的坐标转化为角度。这样的话,我们要找的两个点在把角度排序后一定相邻。因此,我们把角度排序,每一次找相邻的两个点的夹角,不断更新最大值即可。最终的答案就是 \(360^\circ\) 减去这个最大值。注意第一个点和最后一个点夹角的处理。

在数学库中,\(\operatorname{atan2}\) 函数可以方便地求出 \(\arctan(\dfrac{y}{x})\) 的值。注意传参进去的时候先纵后横,并且出来的值是弧度。你可以用 \(\operatorname{atan2}(y,x)\times180\div\pi\) 得到经过点 \((x,y)\) 和原点的射线与 \(x\) 的夹角度数。

代码

posted @ 2022-05-20 15:53  1358id  阅读(31)  评论(0编辑  收藏  举报