Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 21.05.2023
Сообщений: 20

Минимальное количество действий, чтобы сделать все башенки одинаковой высоты

21.05.2023, 13:39. Показов 930. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всего утята собрали n башенок. В i-й башенке оказалось ai кубиков, поставленных друг на друга. Скрудж заметил, что башенки имеют разную высоту. Ему, как большому любителю порядка, это не понравилось, и он решил исправить ситуацию. Скрудж решил, что он будет перекладывать, добавлять и убирать кубики так, чтобы все башенки оказались одинаковой высоты. За одно действие Cкрудж может переложить кубик с одной башенки на другую, убрать кубик из конструкции, или взять кубик из набора и положить его на какую-нибудь башенку. Кубиков в наборе неограниченное количество. Высота башенки определяется как количество кубиков в ней.

Помогите Скруджу посчитать, какое минимальное количество действий ему понадобится для того, чтобы сделать все башенки одинаковой высоты!

Формат входных данных
В первой строке входного файла даны два числа n (1≤n≤1000) — количество башенок. Во второй строке входного файла дано n чисел ai (1≤ai≤1000) — количество кубиков в i-й башенке.

Формат выходных данных
В единственной строке выходного файла выведите единственное число — ответ на задачу.

входные данные выходные данные
5 3
3 2 2 5 4

1 0
1

10 19
18 8 14 15 9 13 6 14 17 10







Моё решение (не сработало правильно на третьем и скрытых тестах):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
using namespace std;
int main() {
  int n, a[1000];
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  int max = 0, min = 0;
  for (int i = 1; i < n; i++) {
    if (a[i] > a[max]) max = i;
    if (a[i] < a[min]) min = i;
  }
  int height = (a[max] + a[min]) / 2;
  int count = 0;
  for (int i = 0; i < n; i++) {
    if (i != max) {
      if (a[i] < height) {
        while (a[i] != height) {
          a[i]++;
          a[max]--;
          count++;
        }
      } else if (a[i] > height) {
        while (a[i] != height) {
          a[i]--;
          a[min]++;
          count++;
        }
      }
      min = 0;
      max = 0;
      for (int j = 1; j < n; j++) {
        if (a[j] > a[max]) max = j;
        if (a[j] < a[min]) min = j;
      }
    }
  }
  for (int i = 0; i < n; i++) {
    if (a[i] < height) {
      while (a[i] != height) {
        a[i]++;
        count++;
      }
    } else if (a[i] > height) {
      while (a[i] != height) {
        a[i]--;
        count++;
      }
    }
  }
  cout<<count;
  return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.05.2023, 13:39
Ответы с готовыми решениями:

как сделать все столбцы таблицы одинаковой высоты
Приветствую братьев по разуму! Помогите решить проблему! html-код генерирует программа (которую я, собственно и пишу -...

Какое минимальное число монет нужно перевернуть, чтобы все монеты лежали одинаковой стороной вверх?
Всем привет прошу помощи или же направления в решение задачи! 1) На столе лежат n монеток. Некоторые из них лежат вверх решкой, а...

Какое минимальное количество ходов должна сделать Катя, чтобы покрасить все точки в жёлтый цвет
На окружности отмечены n точек. Изначально все они белые. Катя играет в игру, закрашивая точки жёлтым. За один ход Катя может либо...

6
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6102 / 2798 / 1037
Регистрация: 01.06.2021
Сообщений: 10,222
21.05.2023, 15:48
Lakstrim, то, что вы удалили начало задачи, ещё ничего. Оно и вправду ни на что не влияет.
Одним прекрасным вечером, рассказывая очередную утиную историю своим любимым внукам — Билли, Дилли и Вилли, Скрудж МакДак вспомнил, как он любил играть с кубиками в детстве. Захваченный воспоминаниями, Скрудж предложил ребятам пособирать башенки из кубиков. Все с радостью поддержали его идею.
Но вот это мне очень не понятно. Это типа только примеры входных данных? Тогда почему вы пишете, что там ещё выходные данные?:

5 3
3 2 2 5 4

1 0
1

10 19
18 8 14 15 9 13 6 14 17 10

Ведь, в оригинальном условии на вход подается:

5
3 2 2 5 4

А на выводе:

3
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,989
21.05.2023, 16:44
Это так, видимо, копипаст работает (второе число - вывод).

Но есть еще не очень понятный момент. Например,
Цитата Сообщение от Lakstrim Посмотреть сообщение
В первой строке входного файла даны два числа n (1≤n≤1000) — количество башенок.
Почему сказано про два числа, если должно быть одно?

Добавлено через 5 минут
Также упомянуты третий и скрытые тесты. Если про последние вроде как ясно по их названию, то в чем заключается тест №3?
Я пытался связаться с Вангой, но она не отвечает (занята или слишком много запросов приходит в ее адрес).
0
0 / 0 / 0
Регистрация: 21.05.2023
Сообщений: 20
21.05.2023, 16:58  [ТС]
Да, в условии задачи изначально содержалась ошибка, на первой строке вводится одно число n.
А входные данные и выходные из-за копи пасты слились

Добавлено через 2 минуты
Третий тест я имел ввиду этот:
входные данные:
10
18 8 14 15 9 13 6 14 17 10
выходные данные:
19
Ведь первый и второй тесты у меня точно правильные получились, а третий (и не знаю насчёт скрытых) - нет.
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,989
21.05.2023, 17:17
Для третьего теста приведен правильный ответ или нет?
Если нет, то какой правильный (если есть эти данные)?
0
0 / 0 / 0
Регистрация: 21.05.2023
Сообщений: 20
21.05.2023, 17:19  [ТС]
Да, ответ 19 - правильный, только в итоге выполнения моего кода другой неправильный ответ
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,989
21.05.2023, 20:15
Лучший ответ Сообщение было отмечено Lakstrim как решение

Решение

Как я понял, нужно (как вариант) переместить кубики так, чтобы в каждой башне кол-во кубиков стало равно исходному среднему значению (точнее, ближайшему целому) кол-ва кубиков (в каждой башне).
У меня такой код получился (через функцию), результаты трех тестов совпадают:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
int ScroogeMyDuck (int n, int *a)
{
  // переменные
  int i, j, sum = 0, avg, count = 0, cube_set = 0;
  double tmp, dif;
 
  // считаем кол-во всех кубиков в башнях
  for (i = 0; i < n; i++)
    sum += a[i];
 
  tmp = 1.0 * sum / n;  // среднее значение
  dif = tmp - int(tmp);  // разница с меньшим целым
 
  // среднее целое значение - "округляем" точное значение до ближайшего целого (как в раньше в школе делали)
  avg = int(tmp) + (dif < 0.5 ? 0 : 1);
 
  // сортируем значения (по убыванию или возрастанию) - это может влиять на лимит по времени
  for (i = 0; i < n - 1; i++)
    for (j = i + 1; j < n; j++)
      if (dif < 0.5 && a[j] > a[i] || dif >= 0.5 && a[j] < a[i])
      {
        int tmp2 = a[j];
        a[j] = a[i];
        a[i] = tmp2;
      }
 
  // "проходим по башням"
  for (i = 0; i < n; i++)
  {
    j = a[i] - avg;  // разница в кубиках между i-ой башней и средним значением
 
    cube_set += j;  // кол-во кубиков, доступных для перемещения (КДДП)
 
    // если есть кубики (с башен), которые можно переместить
    if (dif < 0.5 && cube_set > 0 && j > 0 || dif >= 0.5 && cube_set < 0 && j < 0)
    {
      count += abs(j);  // кол-во действий
      cube_set -= j;  // уменьшаем кол-во КДДП
    }
  }
 
  return count;
}
Насчет скрытых тестов - в коде (строка №17) оставил пометку:
// сортируем значения (по убыванию или возрастанию) - это может влиять на лимит по времени
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.05.2023, 20:15
Помогаю со студенческими работами здесь

Определить, какое минимальное число действий нужно сделать, чтобы последовательность стала пилообразной
Назовем последовательность a1, a2, ..., an пилообразной, если выполняется такое условие a1&lt;a2&gt;a3&lt;a4...... То есть для каждого...

Подсчитать минимальное количество действий, которые надо совершить обезьянке, чтобы получить кучу из n камней
Цирк, цирк, цирк! Цирковая обезьянка еще не может быть полноценным игроком в Ним, но она обучена либо удваивать количество камней в...

Какое минимальное количество действий нужно выполнить над первым словом, чтобы оно совпадало со вторым?
Дано два слова. Какое минимальное количество действий нужно выполнить над первым словом,чтобы оно совпадало со вторым

Сделать изображения одинаковой высоты
Здравствуйте, мне нужно сделать изображения одинаковой высоты. Я делаю вот так: $( document ).ready(function() { var height =...

Avada сделать блоки одинаковой высоты
WordPress, тема Avada. 3 блока. Высота зависит от количества текста. Пытаюсь её зафиксировать, но как-то не получается..


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru