Посчитайте, какое минимальное количество столов потребуется, чтобы рассадить всю компанию - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

а свой день рождения Вася решил пригласить всех своих друзей. Приняли приглашение и подтвердили участие в вечеринке по случаю дня рождения N человек. Вася даже придумал программу вечера для своих друзей: сначала будет чаепитие с тортом, затем игры и конкурсы. Чтобы рассадить всех своих друзей за столы для чаепития и потратить при этом меньше усилий по сервировке праздничных столов, Вася решил посчитать минимальное их количество. Оказалось, что в распоряжении Васи имеется K4 четырехместных стола и K2 — двухместных. Посчитайте, какое минимальное количество столов потребуется, чтобы рассадить всю компанию. Формат ввода В первой и единственной строке вводят числа N, K4, K2 — количество друзей Васи, подтвердивших участие в вечеринке, количество четырехместных столов и количество двухместных столов, которые есть в распоряжении Васи соответственно (1 ≤ N ≤ 1018, 0 ≤ K2, K4 ≤ 1018). Формат вывода Выведите одно число — минимальное количество столов, за которые можно рассадить всех друзей. Если же разместить всех друзей не получится, выведите -1. Пример Ввод 10 5 3 Вывод 3

Решение задачи: «Посчитайте, какое минимальное количество столов потребуется, чтобы рассадить всю компанию»

textual
Листинг программы
program pr;
 
var
  n, k1, k2: integer;
  r, s, f, g: integer;
 
begin
  g := 0;
  readln(n, k1, k2);
  if (n >= 1) and (n <= 1018) and (k2 >= 0) and (k1 <= 1018) then 
  begin
    if n > 5 then
    begin
      r := trunc(n / 4);   // полное количество 4 местных стульев
      s := n - r * 4;
      f := trunc(s / 2); // полное 2 местных стульев
      if (r <= k1) and (f <= k2) and ((f + r) <= k1 + k2) then
      begin
        writeln(f + r);   // комбинация из стульев
      end else writeln(-1);
    end 
    else  begin
      if (n = 1) and ((k1 > 0) or (k2 > 0)) then begin g := 1; writeln(1); exit; end;
      if ((n = 1) or (n = 2) or (n = 3) or (n = 4))  and ((k1 = 0) and (k2 > 1)) then begin g := 1; writeln(2); exit; end;
      if (n = 2)  and ((k1 = 0) and (k2 = 1)) then begin g := 1; writeln(1); exit; end;
      if ((n = 1) or (n = 2) or (n = 3) or (n = 4))  and (k1 > 0) then begin g := 1; writeln(1); exit; end;
      if (n = 5) and (k1 > 1) then begin writeln(2); g := 1; exit end;
      if (n = 5) and (k1 <= 1) and (k2 > 2) then begin g := 1; writeln(3); exit end;
      if g < 1 then 
        writeln(-1);
    end;
  end else writeln('(1 <= N <= 1018, 0 <= K2, K1 <= 1018'); // в этой строчке ещё можно так   end else exit;
end.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы