Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Лука и массив
- Ограничение по времени: 2 секунды
- У Луки есть массив из n целых чисел a1, a2, . . . , an. K каждому элементу массива можно произвольное количество раз применять каждую из следующих магических операций:
- Выбрать некоторый элемент массива ai и заменить его на число [ai2] (данная запись обозначает число ai2, округлённое вниз). Для выполнения данной операции требуется k единиц энергии.
- Выбрать некоторый элемент массива ai и заменить его на число ai−1. Для выполнения данной операции требуется одна единица энергии.
- Ваша задача — определить, какое минимальное количество энергии необходимо, чтобы после выполнения магических операций все элементы массива были равны единице (то есть a1=a2=...=an=1).
- Формат входных данных
- Первая строка содержит одно целое число n (1≤n≤5⋅104) — количество элементов массива.
- Вторая строка содержит одно целое число k (1≤k≤105) — количество энергии, необходимое для выполнения операции первого типа.
- Каждая из следующих n строк содержит одно целое число ai (1≤ai≤109) — элементы массива.
- Обратите внимание, что ответ может быть достаточно большим, поэтому следует использовать 64-битный тип данных, например, long long в C/C++, long в Java, int64 в Pascal.
- Формат выходных данных
- Выведите одно целое число — минимальное количество энергии, необходимое для требуемого преобразования массива.
- Система оценки
- Решения, правильно работающие только для случаев, когда k=1, будут оцениваться в 25 баллов.
- Решения, правильно работающие только для случаев, когда все ai не превосходят 105, будут оцениваться в 50 баллов.
- Пояснение
- Рассмотрим первый пример из условия.
- Первый элемент массива равен 4. Использовав одну единицу энергии, применим к нему первую магическую операцию, после чего первый элемент массива станет равен [42]=2. После этого применим к нему вторую операцию, также затратив одну единицу энергии.
- Второй элемент массива уже равен 1, поэтому применять к нему операции не нужно.
- К третьему элементу применим первую операцию, используя одну единицу энергии. После этого третий элемент станет равен [32]=1.
- Во втором примере из условия применение первой операции расходует слишком много единиц энергии, поэтому выгодно применить вторую операцию девять раз.*/
- #include<iostream>
- #include<fstream>
- #include<vector>
- #define fors(count, st, fn) for (int count = st; count < fn; ++count)
- #define forb(count, st, fn) for (int count = st; count >= fn; --count)
- #define all(container) container.begin(), container.end()
- #define vec(type) std::vector<int>
- #define dvec(type) std::vector<std::vector<int>>
- int n, k;
- int main() {
- std::fstream fin("input.txt");
- fin >> n >> k;
- int ans = 0;
- fors(i, 0, n) {
- int temp;
- fin >> temp;
- if (temp != 1) {
- if (temp % 2 != 0 && temp / 2 != 1) {
- ans += 1;
- temp--;
- }
- ans += (k * temp / 2 < temp ? k * temp / 2 : temp - 1);
- }
- }
- std::cout << ans << std::endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment