egogoboy

всесиб 3

Nov 27th, 2022
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.23 KB | None | 0 0
  1. /*Задача 3. Вадим и лимонад
  2. Имя входного файла: input.txt
  3. Имя выходного файла: output.txt
  4. Ограничение по времени: 2 секунды, для Java — 4 секунды
  5. Ограничение по памяти: 768 мегабайт
  6. «If life gives you lemons, make
  7. lemonade!»
  8. — «Если судьба кормит вас
  9. сплошными лимонами, то ищите
  10. способ сделать из них лимонад. . . »
  11. — Народная мудрость
  12. Знаменитый блогер-программист Вадим очень любит лимонад. Он является активным
  13. сторонником здорового образа жизни, и поэтому может каждый день выпивать полностью
  14. только одну бутылку лимонада — ни больше, ни меньше. Однако, за Вадимом было замечено
  15. странное свойство: выпив 𝑉 нанолитров лимонада качества 𝑞, на следующий день ему хочется
  16. выпить 𝑉 · 𝑞 нанолитров. Причем, чтобы утолить жажду в первый день, Вадиму достаточно
  17. выпить любое ненулевое количество лимонада.
  18. Фан-клуб Вадима решил подарить ему набор бутылок с лимонадом такой, чтобы Вадим
  19. смог как можно дольше не испытывать жажды. При этом его фанаты хотят потратить как
  20. можно меньше денег.
  21. В магазине продаются пустые бутылки без лимонада. Для каждой бутылки известны ее
  22. объем и стоимость. По счастливой случайности у одного из членов фан-клуба есть знакомый
  23. на фабрике лимонада. Поэтому за лимонад не придется платить, однако весь лимонад будет
  24. одинакового качества, и это качество может быть заказано производителям фан-клубом.
  25. Качество лимонада всегда измеряется положительным числом, но, возможно, не целым.
  26. Так как бутылок в магазине может быть много, то вас попросили написать программу,
  27. определяющую самую дешёвую последовательность бутылок, при помощи которой Вадим
  28. сможет максимально долго утолять жажду.
  29. Формат входных данных
  30. В первой строке входного файла записано число 𝑁 — количество бутылок в магазине
  31. (1 6 𝑁 6 5000).
  32. Вторая строка содержит объемы бутылок в магазине. Это 𝑁 целых положительных чисел,
  33. где 𝑉𝑖 — объем 𝑖-й бутылки (1 6 𝑉𝑖 6 1018
  34. , 1 6 𝑖 6 𝑁).
  35. В третью строку записаны, соответственно, стоимости этих бутылок. Это также 𝑁 целых
  36. положительных чисел, где 𝐶𝑖 — стоимость 𝑖-й бутылки (1 6 𝐶𝑖 6 106
  37. , 1 6 𝑖 6 𝑁).
  38. Формат выходных данных
  39. В первую строку выходного файла нужно вывести два числа — количество бутылок и стоимость самого дешёвого набора бутылок, при помощи которого Вадим сможет максимально
  40. долго утолять жажду.
  41. Во вторую строку нужно выведите номера бутылок такого набора в порядке, в котором
  42. Вадим их должен пить.
  43. Если таких наборов несколько, выведите любой.
  44. Страница 6 из 14
  45. Всесибирская открытая олимпиада школьников по информатике
  46. Отборочный очный этап, 9-11 классы, 27 ноября 2022 г.
  47. Система оценки
  48. Баллы за каждую подзадачу начисляются только в случае, если все тесты для этой подзадачи и необходимых подзадач успешно пройдены.
  49. Подзадача Баллы Ограничения Необходимые подзадачи
  50. 1 0 Тесты из условия
  51. 2 15 1 6 𝑁 6 20; 1 6 𝑉𝑖 6 109 1
  52. 3 35 1 6 𝑁 6 500; 1 6 𝑉𝑖 6 109 1, 2
  53. 4 40 1 6 𝑉𝑖 6 109 1, 2, 3
  54. 5 10 Нет дополнительных ограничений 1, 2, 3, 4
  55. Примеры
  56. input.txt output.txt
  57. 5
  58. 1 7 4 8 2
  59. 1 2 3 4 5
  60. 4 13
  61. 1 5 3 4
  62. 4
  63. 1 1 2 2
  64. 10 8 7 7
  65. 2 14
  66. 3 4
  67. Замечание
  68. Качество лимонада может быть меньшим 1, тогда на следующий день Вадиму захочется
  69. выпить меньше лимонада, чем в текущий.*/
  70.  
  71. #include<iostream>
  72. #include<vector>
  73. #include<stdint.h>
  74. #include<fstream>
  75. #include<string>
  76. #include<algorithm>
  77. #define all(container) (container.begin(), container.end())
  78. #define fors(counter, start, finish) for (int counter = start; counter < finish; ++counter);
  79. #define forb(counter, start, finish) for (int counter = start; counter >= finish; --counter);
  80. #define vec(type) std::vector<type>
  81. #define dvec(type) std::vector<std::vector<type>>
  82. #define ll int64_t
  83. //#define fin std::cin
  84. //#define fout std::cout
  85.  
  86. struct boutle {
  87.     double v;
  88.     double c;
  89. };
  90.  
  91. int n;
  92. std::pair<int, int> ans;
  93. std::vector<boutle> b;
  94. vec(int) res, dres;
  95. vec(bool) done;
  96. void per(double& q, double v, int count, int dol) {
  97.     res.push_back(v);
  98.     double temp = b[v].v * q;
  99.     for (int i = 0; i < n; ++i) {
  100.         if (b[i].v == temp && !done[i]) {
  101.             done[i] = !done[i];
  102.             per(q, i, count + 1, dol + b[i].c);
  103.             done[i] = !done[i];
  104.         }
  105.     }
  106.     if (ans.first < count || (ans.first == count && ans.second > dol)) {
  107.         ans.first = count; ans.second = dol;
  108.         dres = res;
  109.     }
  110.     res.resize(res.size() - 1);
  111.     return;
  112. }
  113.  
  114. int main() {
  115.     std::ifstream fin("input.txt");
  116.     std::ofstream fout("output.txt");
  117.     ans.first = 0; ans.second = 1000000000;
  118.     fin >> n;
  119.     b.resize(n); done.resize(n);
  120.     for (int i = 0; i < n; ++i)
  121.         fin >> b[i].v;
  122.     for (int i = 0; i < n; ++i)
  123.         fin >> b[i].c;
  124.     for (int i = 0; i < n; ++i) {
  125.         if (!done[i]) {
  126.             done[i] = !done[i];
  127.             res.push_back(i);
  128.             for (int j = i + 1; j < n; ++j) {
  129.                 if (!done[j]) {
  130.                     done[j] = !done[j];
  131.                     double q = b[j].v / b[i].v;
  132.                     per(q, j, 2, b[i].c + b[j].c);
  133.                     done[j] = !done[j];
  134.                 }
  135.             }
  136.             done[i] = !done[i];
  137.             res.resize(res.size() - 1);
  138.         }
  139.     }
  140.     fout << ans.first << " " << ans.second << std::endl;
  141.     for (int i = 0; i < dres.size(); ++i)
  142.         fout << dres[i] + 1 << " ";
  143.     return 0;
  144. }
Tags: olimp
Add Comment
Please, Sign In to add comment