Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <fstream>
- #include <vector>
- #include <cmath>
- #include <utility>
- using namespace std;
- bool compare(pair<double, bool> a, pair<double, bool> b) // критерий сортировки вектора,содержащего pair<tg,bool>
- { // в данном случае bool определяет 1-если tg - начало тени,
- if (a.first == b.first) // 0- если конец тени // a.first == b.first
- {
- return a.second; // Компаратор как бы отвечает на вопрос :
- } // "Правда ли, что сначала в отсортированном массиве должен идти элемент а, а потом b?"
- // если значение тангенсов совпадают,то первый будет открывающий,а потом закрывающий
- return a.first < b.first;
- }
- int main()
- {
- ifstream fin("rect.in");
- ofstream fout("rect.out");
- double x_max;
- double y_max;
- int rect_value;
- double x0, y0, x1, y1;
- double x0_shadow, x1_shadow, y0_shadow, y1_shadow; //координаты тени ,которая падает от прямоугольника
- fin >> x_max >> y_max >> rect_value;
- double tg_max = y_max / x_max;
- double tg0, tg1;
- vector <pair<double, bool>> all_tgs;
- for (int i = 0; i < rect_value; i++)
- { // такой ввод ,потому что по условию нам дают координаты нижнего левого
- fin >> x1 >> y0 >> x0 >> y1; // угла ,и верхнего правого,а нам нужен верх.левый и ниж.правый
- tg0 = y0 / x0;
- tg1 = y1 / x1;
- if (tg0 <= tg_max) {
- double y = ceil(tg0 * x_max);
- all_tgs.push_back({ y / x_max, true });
- }
- else if (tg0 > tg_max) {
- double x = floor(y_max / tg0);
- all_tgs.push_back({ y_max / x, true });
- }
- if (tg1 <= tg_max) {
- double y = floor(tg1 * x_max);
- all_tgs.push_back({ y / x_max, false });
- }
- else if (tg1 > tg_max) {
- double x = ceil(y_max / tg1);
- all_tgs.push_back({ y_max / x, false });
- }
- }
- sort(all_tgs.begin(), all_tgs.end(), compare);
- // проверка сортировки
- for (int i = 0; i < all_tgs.size(); i++)
- {
- fout << all_tgs[i].first << " " << all_tgs[i].second << '\n';
- }
- int k = 0;
- int k_max = 0;
- int index_of_max_value_k = 0;
- for (int i = 0; i < all_tgs.size(); i++)
- {
- if (all_tgs[i].second == 1)
- {
- k++;
- if (k >= k_max)
- {
- k_max = k;
- index_of_max_value_k = i;
- }
- }
- else
- {
- k--;
- }
- }
- double control_x;
- double control_y;
- fout << k_max << " ";
- if (all_tgs[index_of_max_value_k].first > tg_max)
- {
- control_x = y_max / all_tgs[index_of_max_value_k].first;
- control_y = y_max;
- fout << control_x << " " << control_y;
- }
- else if (all_tgs[index_of_max_value_k].first < tg_max)
- {
- control_x = x_max;
- control_y = all_tgs[index_of_max_value_k].first * x_max;
- fout << control_x << " " << control_y;
- }
- else
- {
- control_x = x_max;
- control_y = y_max;
- fout << control_x << " " << control_y;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement