思路:
要想使最小的角度包含所有的点,必定会有两个相邻点所夹得角没有被覆盖,而且只有一个。现在,把这个角找出来就可以了。
#include <bits/stdc++.h> using namespace std; const double PI = acos(-1.0); const int MAXN = 1e5 + 10; double ang[MAXN]; bool cmp(double x, double y) {return x > y;} int main () { int n; double a, b; while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; i++) { scanf("%lf%lf", &a, &b); ang[i] = atan(b/a)/PI*180; if (ang[i] < 0) ang[i] += 180; if (b < 0 || a < 0 && b == 0) ang[i] += 180; } sort(ang, ang + n, cmp); double ans = 360 - ang[0] + ang[n - 1]; //用最后一个减去第一个,从而形成一个环。 for (int i = 0; i < n - 1; i++) { ans = max(ans, ang[i] - ang[i + 1]); } printf("%.8lf\n", 360 - ans); } return 0; }