Advertisement
Guest User

NikolaevMisha/2.2/new

a guest
Oct 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.96 KB | None | 0 0
  1. #include <iostream>
  2. /*
  3. Группа людей называется современниками если был такой момент, когда они могли собраться вместе. Для этого в этот момент каждому из них должно было  уже исполниться 18 лет, но ещё не исполниться 80 лет.
  4. Дан список Жизни Великих Людей. Необходимо получить максимальное количество современников. В день 18летия человек уже может принимать участие в собраниях, а в день 80летия и в день смерти уже не может.
  5. Замечание. Человек мог не дожить до 18-летия, либо умереть в день 18-летия. В этих случаях принимать участие в собраниях он не мог.
  6.  
  7. */
  8.  
  9.  
  10.  
  11. bool swap3(int a1 , int a2 , int a3 , int b1 , int b2 , int b3) // спрашивает, верно ли , что (день1,месяц1,год1) >= (день2,месяц2,год2)
  12.  
  13. {
  14.  
  15.     if(a3 > b3)
  16.     {
  17.         return true;
  18.     }
  19.     if(a3 < b3)
  20.     {
  21.         return false;
  22.     }
  23.     else
  24.     {
  25.         if(a2 > b2)
  26.         {
  27.             return true;
  28.         }
  29.         if(a2 < b2)
  30.         {
  31.             return false;
  32.         }
  33.         else
  34.         {
  35.             if(a1 >= b1)
  36.             {
  37.                 return true;
  38.             }
  39.             else
  40.             {
  41.  
  42.                 return false;
  43.             }
  44.  
  45.         }
  46.     }
  47.  
  48. }
  49.  
  50.  
  51. void SiftDown(int* a , int* b, int* c , int n ,  int i)
  52. {
  53.     int left = 2 * i + 1;
  54.     int right = 2 * i + 2;
  55.     int q = i;
  56.     if ((left <= n - 1  ) && (swap3(a[q] , b[q] , c[q] , a[left] , b[left] , c [left]) == false))
  57.     {
  58.         q = left;
  59.     }
  60.     if ((right <= n - 1) && (swap3(a[q] , b[q] , c[q] , a[right] , b[right] , c [right])== false))
  61.     {
  62.         q = right;
  63.     }
  64.     if (q != i)
  65.     {
  66.         std::swap(a[i] , a[q]);
  67.         std::swap(b[i] , b[q]);
  68.         std::swap(c[i] , c[q]);
  69.         SiftDown(a , b , c, n , q);
  70.     }
  71. }
  72.  
  73. void SiftUp(int* arr , int i)
  74. {
  75.     int father = (i - 1) / 2;
  76.     if((i != 0) && (arr[i] > arr[father]))
  77.     {
  78.         std::swap(arr[i], arr[father]);
  79.         i = father;
  80.         SiftUp(arr, i);
  81.     }
  82.  
  83. }
  84.  
  85.  
  86.  
  87.  
  88.  
  89. int main()
  90. {
  91.     int n;
  92.     std::cin >> n;
  93.     int Day1[n];
  94.     int Month1[n];
  95.     int Year1[n];
  96.  
  97.     int Day2[n];
  98.     int Month2[n];
  99.     int Year2[n];
  100.     for(int i = 0; i < n; ++ i)
  101.     {
  102.         std::cin >> Day1[i] >> Month1[i] >> Year1[i] >> Day2[i] >> Month2[i] >> Year2[i];
  103.         Year1[i] = Year1[i] + 18;
  104.  
  105.         if( swap3(Day1[i] , Month1[i] , Year1[i], Day2[i] , Month2[i] , Year2[i]) == true) // если человек умирает до своего 18летия, мы "удаляем" его
  106.         {
  107.             Year1[i] = -1;
  108.             Year2[i] = -1;
  109.         }
  110.  
  111.  
  112.  
  113.         if(swap3(Day2[i] , Month2[i] , Year2[i] , Day1[i] , Month1[i] , Year1[i] + 62) == true ) // если человек доживает до своего 80летия, заменяем его день смерти на день его 80летия
  114.         {
  115.             Day2[i] = Day1[i];
  116.             Month2[i] = Month1[i];
  117.             Year2[i] = Year1[i] + 62;
  118.         }
  119.  
  120.  
  121.     }
  122.     for(int i = (n - 2) / 2; i >= 0; --i)
  123.     {
  124.         SiftDown(Day1 , Month1 , Year1, n , i);
  125.         SiftDown(Day2 , Month2 , Year2, n , i);
  126.     }
  127.     int length = n;
  128.  
  129.  
  130.     while(length > 0)
  131.     {
  132.  
  133.         std::swap(Day1[0] , Day1[length-1]);
  134.         std::swap(Month1[0] , Month1[length-1]);
  135.         std::swap(Year1[0] , Year1[length-1]);
  136.  
  137.  
  138.         std::swap(Day2[0] , Day2[length-1]);
  139.         std::swap(Month2[0] , Month2[length-1]);
  140.         std::swap(Year2[0] , Year2[length-1]);
  141.         SiftDown(Day2 , Month2 , Year2 , length - 1 , 0);
  142.  
  143.         SiftDown(Day1 , Month1 , Year1 , length - 1 , 0);
  144.         --length;
  145.     }
  146.  
  147. /*
  148. теперь годы родения отсортированы и годы смерти отсортированы
  149. */
  150.  
  151.     int i = 0; // пропускаем людей, которые умерли до 18летия
  152.     while(Year1[i] == -1)
  153.     {
  154.         ++i;
  155.     }
  156.     int j = 0;
  157.     while(Year2[j] == -1)
  158.     {
  159.         ++j;
  160.     }
  161.     int k = 0;
  162.     int maxk = 0;
  163.     while(i < n && j < n) // k на каждом интервале равен количеству людей, которые могут принимать участие в собании в даннызй момент времени
  164.     {
  165.         if(swap3(Day1[i] , Month1[i] , Year1[i] , Day2[j] , Month2[j] , Year2[j]) == false)
  166.         {
  167.             ++i;
  168.             ++k;
  169.             maxk = std::max( k , maxk);
  170.         }
  171.         else
  172.         {
  173.             ++j;
  174.             --k;
  175.  
  176.         }
  177.     }
  178.  
  179.     std::cout << maxk;
  180.  
  181.     return 0;
  182.  
  183.  
  184.  
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement