begin
var r : = seqrandomreal(readinteger('n='), -50, 50)
.select(t -> round(t, ;
r.println;
var imin : = r.indexmin;
var q : = r.select(t -> t * r[imin]).toarray;
q.println; // если надо
r[imin] : = q.average;
r.println
end.
примерn= 7
30.94 -31.83 41.85 -42.56 34.33 19.38 1.88
-1316.8064 1354.6848 -1781.136 1811.3536 -1461.0848 -824.8128 -80.0128
30.94 -31.83 41.85 -328.2592 34.33 19.38 1.88
Поделитесь своими знаниями, ответьте на вопрос:
общее уравнение прямой:
мы знаем координаты двух точек, лежащих на прямой. обозначим их как и . тогда:
решениемы знаем координаты точек многоугольника.
для каждого ребра (пары соседних точек) мы должны проверить, чтобы все остальные точки находились по одну сторону от прямой, которой принадлежит эта пара точек.
т.е., мы перебираем каждое ребро и смотрим, чтобы остальные точки были одного знака.
оказывается, смотреть все точки необязательно! нам нужно проверить каждое ребро, чтобы сказать ответ. поэтому, нам достаточно смотреть лишь положение двух соседних с этим ребром точек относительно ребра.
итого, мы должны для каждого ребра убедиться, что две соседних с этим ребром точки лежат по одну сторону от ребра. вот и всё.
код#include < bits/stdc++.h>
using namespace std;
int main() {
int n;
cin > > n;
long double x[n+2];
long double y[n+2];
for (int i = 0; i < n; i++) {
cin > > x[i] > > y[i];
}
x[n] = x[0];
y[n] = y[0];
x[n+1] = x[1];
y[n+1] = y[1];
for (int i = 1; i < n; i++) {
long double a = y[i+1] - y[i];
long double b = x[i] - x[i+1];
long double c = y[i] * x[i+1] - x[i]*y[i+1];
if ((a*x[i-1]+b*y[i-1]+c)*(a*x[i+2]+b*y[i+2]+c) < 0) {
cout < < "no" < < endl;
return 0;
}
}
cout < < "yes" < < endl;
return 0;
}