Advertisement
Artem771577

rect

Feb 23rd, 2020
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.36 KB | None | 0 0
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <vector>
  4. #include <cmath>
  5. #include <utility>
  6. using namespace std;
  7.  
  8. bool compare(pair<double, bool> a, pair<double, bool> b) // критерий сортировки вектора,содержащего pair<tg,bool>
  9. { // в данном случае bool определяет 1-если tg - начало тени,
  10. if (a.first == b.first) // 0- если конец тени // a.first == b.first
  11. {
  12. return a.second; // Компаратор как бы отвечает на вопрос :
  13. } // "Правда ли, что сначала в отсортированном массиве должен идти элемент а, а потом b?"
  14. // если значение тангенсов совпадают,то первый будет открывающий,а потом закрывающий
  15. return a.first < b.first;
  16. }
  17.  
  18. int main()
  19. {
  20. ifstream fin("rect.in");
  21. ofstream fout("rect.out");
  22.  
  23. double x_max;
  24. double y_max;
  25. int rect_value;
  26. double x0, y0, x1, y1;
  27. double x0_shadow, x1_shadow, y0_shadow, y1_shadow; //координаты тени ,которая падает от прямоугольника
  28.  
  29. fin >> x_max >> y_max >> rect_value;
  30.  
  31. double tg_max = y_max / x_max;
  32. double tg0, tg1;
  33.  
  34. vector <pair<double, bool>> all_tgs;
  35.  
  36. for (int i = 0; i < rect_value; i++)
  37. { // такой ввод ,потому что по условию нам дают координаты нижнего левого
  38. fin >> x1 >> y0 >> x0 >> y1; // угла ,и верхнего правого,а нам нужен верх.левый и ниж.правый
  39. tg0 = y0 / x0;
  40. tg1 = y1 / x1;
  41. if (tg0 <= tg_max) {
  42. double y = ceil(tg0 * x_max);
  43. all_tgs.push_back({ y / x_max, true });
  44. }
  45. else if (tg0 > tg_max) {
  46. double x = floor(y_max / tg0);
  47. all_tgs.push_back({ y_max / x, true });
  48. }
  49.  
  50. if (tg1 <= tg_max) {
  51. double y = floor(tg1 * x_max);
  52. all_tgs.push_back({ y / x_max, false });
  53. }
  54. else if (tg1 > tg_max) {
  55. double x = ceil(y_max / tg1);
  56. all_tgs.push_back({ y_max / x, false });
  57. }
  58. }
  59.  
  60.  
  61.  
  62. sort(all_tgs.begin(), all_tgs.end(), compare);
  63.  
  64. // проверка сортировки
  65. for (int i = 0; i < all_tgs.size(); i++)
  66. {
  67. fout << all_tgs[i].first << " " << all_tgs[i].second << '\n';
  68. }
  69.  
  70. int k = 0;
  71. int k_max = 0;
  72. int index_of_max_value_k = 0;
  73. for (int i = 0; i < all_tgs.size(); i++)
  74. {
  75. if (all_tgs[i].second == 1)
  76. {
  77. k++;
  78. if (k >= k_max)
  79. {
  80. k_max = k;
  81. index_of_max_value_k = i;
  82. }
  83. }
  84. else
  85. {
  86. k--;
  87. }
  88. }
  89.  
  90.  
  91. double control_x;
  92. double control_y;
  93. fout << k_max << " ";
  94. if (all_tgs[index_of_max_value_k].first > tg_max)
  95. {
  96. control_x = y_max / all_tgs[index_of_max_value_k].first;
  97. control_y = y_max;
  98. fout << control_x << " " << control_y;
  99. }
  100. else if (all_tgs[index_of_max_value_k].first < tg_max)
  101. {
  102. control_x = x_max;
  103. control_y = all_tgs[index_of_max_value_k].first * x_max;
  104. fout << control_x << " " << control_y;
  105. }
  106. else
  107. {
  108. control_x = x_max;
  109. control_y = y_max;
  110. fout << control_x << " " << control_y;
  111. }
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement