Advertisement
paranid5

E(C++)

Jul 15th, 2020 (edited)
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.65 KB | None | 0 0
  1. /*
  2. Для пассажиров кольцевой железнодорожной линии, построенной в столице Байтландии, существует следующая система абонементных билетов. Заплатив ai байтландских тугриков, пассажир получает право проезда от станции 0 до станции i (и только до неё). Таким образом, право проезда на две станции i и j даёт абонементный билет стоимостью ai+aj. Так как, кроме станции 0, на кольцевой линии находятся ещё n станций, то всего существует 2^n различных абонементов (включая и бесплатный абонемент со станции 0 до самой себя), отличающиеся множеством станций, до которых они дают проезд.
  3.  
  4. Вам дана стоимость каждого из 2n абонементов. Требуется восстановить ai или сообщить, что при передаче списка стоимостей абонементов произошла ошибка и ни при каких ai указанные стоимости не могут быть сформированы.
  5.  
  6. Формат ввода
  7. Первая строка содержит одно целое число n (1 ≤ N ≤ 18) — количество станций (кроме станции 0), находящихся на линии. Каждая их последующих 2n строк содержит одно целое число — стоимость очередного абонемента (0 ≤ p ≤ 228).
  8.  
  9. Формат вывода
  10. Выведите n целых чисел в неубывающем порядке — значения ai. Если вариантов несколько, выведите любой.
  11.  
  12. Если решения нет, выведите текст “impossible”.
  13. */
  14.  
  15. #include <cstdio>
  16. #include <set>
  17. #include <vector>
  18. #include <cmath>
  19.  
  20. int main()
  21. {
  22.     std::multiset<int> list;
  23.     int n;
  24.     scanf("%d", &n);
  25.     const int pow_collect = pow(2, n);
  26.  
  27.     for (int i = 0; i < pow_collect; i++)
  28.     {
  29.         int x;
  30.         scanf("%d", &x);
  31.         list.insert(x);
  32.     }
  33.  
  34.     bool correct = true;
  35.  
  36.     const auto zero = list.find(0);
  37.     if (zero != list.end())
  38.         list.erase(list.find(0));
  39.     else correct = false;
  40.  
  41.     if (!correct) puts("impossible");
  42.     else
  43.     {
  44.         if (n == 1) printf("%d", *list.begin());
  45.         else
  46.         {
  47.             std::vector<int> ans;
  48.             std::vector<int> sums;
  49.  
  50.             ans.push_back(*list.begin());
  51.             list.erase(list.find(*list.begin()));
  52.             sums.push_back(ans.back());
  53.  
  54.             ans.push_back(*list.begin());
  55.             list.erase(list.find(*list.begin()));
  56.             sums.push_back(ans.back());
  57.  
  58.             sums.push_back(ans[0] + ans[1]);
  59.             const auto v1_2 = list.find(sums.back());
  60.             if (v1_2 == list.end()) correct = false;
  61.             else list.erase(v1_2);
  62.  
  63.             while (correct && ans.size() < n)
  64.             {
  65.                 ans.push_back(*list.begin());
  66.                 list.erase(list.find(*list.begin()));
  67.                 sums.push_back(ans.back());
  68.  
  69.                 const int size = sums.size() - 1;
  70.                 for (int i = 0; i < size; i++)
  71.                 {
  72.                     sums.push_back(sums[i] + ans.back());
  73.                     const auto del = list.find(sums.back());
  74.                     if (del != list.end())
  75.                         list.erase(del);
  76.                     else
  77.                     {
  78.                         correct = false;
  79.                         break;
  80.                     }
  81.                 }
  82.                 if (!correct) break;
  83.             }
  84.  
  85.             if (!correct || !list.empty()) puts("impossible");
  86.             else
  87.                 for (int i : ans)
  88.                     printf("%d\n", i);
  89.         }
  90.     }
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement