Задача
На границе окружности с центром в начале координат и радиусом $r$ заданы $n$ различных точек. Поскольку все точки расположены на одной окружности, то любые три из них не коллинеарны, и поэтому образуют треугольник. Вам необходимо вычислить суммарную площадь всех этих $C_{n}^3$ треугольников.
Входные данные
Состоит из не более чем $16$ тестов. Каждый тест начинается двумя целыми числами $n \left(0 ≤ n ≤ 500\right)$ и $r \left(0 < r ≤ 100\right)$. Через $n$ обозначено количество точек, а через $r$ радиус окружности. Центр окружности находится в центре координат. Дальше следуют $n$ строк, каждая из которых содержит действительное число $θ \left(0 ≤ θ < 360 \right)$, которое определяет угол в градусах между точкой и направлением $x$-оси. Например, если $θ$ равно $30$ градусов, то соответствующая точка имеет декартовы координаты $\left(r \cdot \cos(30°), r \cdot \sin(30°) \right)$. Последняя строка содержит $n = r = 0$ и не обрабатывается.
Выходные данные
Для каждого теста в отдельной строке вывести целое число — суммарную площадь (округленную до ближайшего целого) всех возможных треугольников, образованных заданными $n$ точками.
Тесты
Входные данные | Выходные данные |
5 10 10 100 300 310 320 3 20 10 100 300 0 0 |
286 320 |
3 5 25 176 243 0 0 |
25 |
4 20 30 80 130 330 0 0 |
822 |
2 7 30 230 0 0 |
0 |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#include <iostream> #include <algorithm> #include <math.h> #include <stdio.h> using namespace std; int main(){ double ang, s, sq, r2, res, M[500]; int n, r, pts; while(cin >> n >> r, n + r != 0){ for(int i = 0; i < n; i++){ cin >> M[i]; M[i] = M[i] * M_PI / 180; } sort(M, M + n); res = M_PI * r * r * n * (n - 1) * (n - 2) / 6; r2 = r * r / 2.0; sq = M_PI * r * r; for(int i = 0; i < n; i++){ for(int j = i + 1; j < n; j++){ ang = M[j] - M[i]; if(ang < M_PI){ s = r2 * (ang - sin(ang)); }else{ ang = 2 * M_PI - ang; s = sq - r2 * (ang - sin(ang)); } pts = n - (j - i + 1); res = res - s * pts; pts = n - 2 - pts; res = res - (sq - s) * pts; } } printf("%.f\n", res); } return 0; } |
Решение задачи
Радианная мера точек заносится в массив, после чего массив сортируется по возрастанию с помощью функции sort().
В переменную
res изначально заносится площадь, равная площади кругов радиуса $r$,
то есть значение $C_{n}^3 \cdot \pi \cdot r^2 = n(n-1)(n-2)(n-2)\pi \cdot \frac{r^2} {6}$. Значение $\frac{r^2} {2}$ присваивается переменной
r2, а
sq – площадь одного круга, то есть $\pi \cdot r^2$.
Перебираются пары точек, а затем вычисляется угол.
Если угол меньше, то проходимся по меньшему сегменту, площадь которого равна $\pi r^2-0.5r^2(\alpha-\sin \alpha)$, $\alpha = 2\pi -\alpha$. В ином случае мы проходим по большему сегменту.
В любом случае переменной
s присваивается площадь сегмента, который мы проходим от $P_{i}$ к $P_{j}$ при движении против часовой стрелки.
Количество точек, лежащих на сегменте, равно $n-(j-i+1)$.
Значит, из переменной
res необходимо вычесть площадь сегмента
s такое количество раз, которому равно количество точек, то есть
pts .
Количество точек, которые лежат на сегменте площади
s , равно $n-2- $
pts.
Площадь противоположного сегмента равна разности площади круга и сегмента. Для получения ответа вычитаем площадь противоположного сегмента из переменной
res такое количество раз, которое равно значению переменной
pts и выводим полученное значение.
Ссылки
Условие задачи на e-olymp.com
Решение задачи ideone.com
Для отправки комментария необходимо войти на сайт.