要想使最小的角度包含所有的点,必定会有两个相邻点所夹得角没有被覆盖,而且只有一个。现在,把这个角找出来就可以了。
#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;
}