egogoboy

Школа 4

Oct 26th, 2022 (edited)
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.56 KB | None | 0 0
  1. /*Лука и массив
  2. Ограничение по времени: 2 секунды
  3.  
  4. У Луки есть массив из n целых чисел a1, a2, . . . , an. K каждому элементу массива можно произвольное количество раз применять каждую из следующих магических операций:
  5.  
  6. Выбрать некоторый элемент массива ai и заменить его на число [ai2] (данная запись обозначает число ai2, округлённое вниз). Для выполнения данной операции требуется k единиц энергии.
  7. Выбрать некоторый элемент массива ai и заменить его на число ai−1. Для выполнения данной операции требуется одна единица энергии.
  8. Ваша задача — определить, какое минимальное количество энергии необходимо, чтобы после выполнения магических операций все элементы массива были равны единице (то есть a1=a2=...=an=1).
  9.  
  10. Формат входных данных
  11. Первая строка содержит одно целое число n (1≤n≤5⋅104) — количество элементов массива.
  12. Вторая строка содержит одно целое число k (1≤k≤105) — количество энергии, необходимое для выполнения операции первого типа.
  13. Каждая из следующих n строк содержит одно целое число ai (1≤ai≤109) — элементы массива.
  14. Обратите внимание, что ответ может быть достаточно большим, поэтому следует использовать 64-битный тип данных, например, long long в C/C++, long в Java, int64 в Pascal.
  15.  
  16. Формат выходных данных
  17. Выведите одно целое число — минимальное количество энергии, необходимое для требуемого преобразования массива.
  18.  
  19. Система оценки
  20. Решения, правильно работающие только для случаев, когда k=1, будут оцениваться в 25 баллов.
  21. Решения, правильно работающие только для случаев, когда все ai не превосходят 105, будут оцениваться в 50 баллов.
  22.  
  23. Пояснение
  24. Рассмотрим первый пример из условия.
  25.  
  26. Первый элемент массива равен 4. Использовав одну единицу энергии, применим к нему первую магическую операцию, после чего первый элемент массива станет равен [42]=2. После этого применим к нему вторую операцию, также затратив одну единицу энергии.
  27. Второй элемент массива уже равен 1, поэтому применять к нему операции не нужно.
  28. К третьему элементу применим первую операцию, используя одну единицу энергии. После этого третий элемент станет равен [32]=1.
  29. Во втором примере из условия применение первой операции расходует слишком много единиц энергии, поэтому выгодно применить вторую операцию девять раз.*/
  30.  
  31.  
  32.  
  33. #include<iostream>
  34. #include<fstream>
  35. #include<vector>
  36. #define fors(count, st, fn) for (int count = st; count < fn; ++count)
  37. #define forb(count, st, fn) for (int count = st; count >= fn; --count)
  38. #define all(container) container.begin(), container.end()
  39. #define vec(type) std::vector<int>
  40. #define dvec(type) std::vector<std::vector<int>>
  41.  
  42. int n, k;
  43.  
  44. int main() {
  45.     std::fstream fin("input.txt");
  46.     fin >> n >> k;
  47.     int ans = 0;
  48.     fors(i, 0, n) {
  49.         int temp;
  50.         fin >> temp;
  51.         if (temp != 1) {
  52.             if (temp % 2 != 0 && temp / 2 != 1) {
  53.                 ans += 1;
  54.                 temp--;
  55.             }
  56.             ans += (k * temp / 2 < temp ? k * temp / 2 : temp - 1);
  57.         }
  58.     }
  59.  
  60.     std::cout << ans << std::endl;
  61.  
  62.     return 0;
  63. }
Advertisement
Add Comment
Please, Sign In to add comment