В
Все
Б
Биология
Б
Беларуская мова
У
Українська мова
А
Алгебра
Р
Русский язык
О
ОБЖ
И
История
Ф
Физика
Қ
Қазақ тiлi
О
Окружающий мир
Э
Экономика
Н
Немецкий язык
Х
Химия
П
Право
П
Психология
Д
Другие предметы
Л
Литература
Г
География
Ф
Французский язык
М
Математика
М
Музыка
А
Английский язык
М
МХК
У
Українська література
И
Информатика
О
Обществознание
Г
Геометрия
Суеверие
Суеверие
24.02.2023 11:08 •  Информатика

Спонсоры олимпиады предоставили оргкомитету n призов для победителей олимпиады. стоимости всех призов различны и выражаются натуральными числами от 1 до n перед оргкомитетом возникла распределить эти призы между k участниками так, чтобы все участники получили одинаковое количество призов, и, кроме того, суммарные стоимости призов, полученных разными участниками, совпадали. гарантируется, что n делится на k входные данные на вход программы поступают два числа: n и k (1≤ выходные данные выведите k строк по n/k чисел в каждой. в каждое строке должны быть выведены стоимости призов, которые вручаются соответствующему участнику. если распределить призы требуемым образом невозможно, выведите одно число 0. примеры входные данные 8 2 выходные данные 1 4 6 7 2 3 8 5 входные данные 6 3 выходные данные 1 6 3 4 5 2

Показать ответ
Ответ:
olesya8262
olesya8262
01.09.2020 20:51
//PascalABC.NET
//Версия 3.3, сборка 1634 (14.02.2018)

begin
   var (n, k) := ReadInteger2('n,k->');
   var p := ArrGen(n, t -> t + 1); 
   var m := new integer[k, n div k];
   var sum := p.Sum div k;
   for var i := 0 to k - 1 do
   begin
      var m_sum := sum;
      m[i, 0] := p[0]; m_sum := m_sum - m[i, 0];
      p := p[1:];
      for var j := 1 to (n div k) - 1 do
      begin
         if m_sum - p.Last > 0 then begin m[i, j] := p.max;  m_sum := m_sum - p.Max; p := p[:p.IndexMax]; end
         else 
         begin
            if p.Where(t -> t = m_sum).Count = 1 then m[i, j] := m_sum;
            p := p.Where(t -> t <> m_sum).ToArray;
         end;                                                 
     end;
   end; 
   var t := true;
   for var i := 0 to m.RowCount - 2 do
     if (m.Row(i).sum <> m.Row(i + 1).Sum) or (p.Length <> 0) then begin t := false; break; end;
   if t then m.Println else 0.Println;
end.

Пример(1):
 n,k-> 8 2
   1   8   7   2
   3   6   5   4

Пример(2):
 n,k-> 6 3
   1   6
   2   5
   3   4
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота