В
Все
М
Математика
А
Английский язык
Х
Химия
Э
Экономика
П
Право
И
Информатика
У
Українська мова
Қ
Қазақ тiлi
О
ОБЖ
Н
Немецкий язык
Б
Беларуская мова
У
Українська література
М
Музыка
П
Психология
А
Алгебра
Л
Литература
Б
Биология
М
МХК
О
Окружающий мир
О
Обществознание
И
История
Г
Геометрия
Ф
Французский язык
Ф
Физика
Д
Другие предметы
Р
Русский язык
Г
География
дима22819
дима22819
23.08.2021 12:09 •  Информатика

Вс++ входные данные в первой строке вводится одно число n (3≤n≤100000). далее в n строках задается по паре чисел – координаты очередной вершины простого многоугольника в порядке обхода по или против часовой стрелки. выходные данные выведите одну строку: “yes”, если многоугольник является выпуклым, и “no” в противном случае. примеры входные данные 3 0 0 0 1 1 0 выходные данные yes входные данные 6 0 0 0 2 1 2 1 1 2 1 2 0 выходные данные no

Показать ответ
Ответ:
Alicewonderr
Alicewonderr
10.09.2020 22:28
Уравнение прямой

Общее уравнение прямой: Ax + By + C = 0

Мы знаем координаты двух точек, лежащих на прямой. Обозначим их как (x_1; y_1) и (x_2;y_2). Тогда:

A=y_2-y_1\\B=x_1-x_2\\C=y_1x_2-x_1y_2


Решение

Мы знаем координаты точек многоугольника.

Для каждого ребра (пары соседних точек) мы должны проверить, чтобы все остальные точки находились по одну сторону от прямой, которой принадлежит эта пара точек.

Т.е., мы перебираем каждое ребро и смотрим, чтобы остальные точки были одного знака.

Оказывается, смотреть все точки необязательно! Нам нужно проверить каждое ребро, чтобы сказать ответ. Поэтому, нам достаточно смотреть лишь положение двух соседних с этим ребром точек относительно ребра.

Итого, мы должны для каждого ребра убедиться, что две соседних с этим ребром точки лежат по одну сторону от ребра. Вот и всё.


Код

#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;


}

0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота