Форум программистов, компьютерный форум, киберфорум
Наши страницы
Turbo Pascal
Войти
Регистрация
Восстановить пароль
 
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
#1

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

07.06.2016, 17:41. Просмотров 563. Ответов 9
Метки нет (Все метки)

а свой день рождения Вася решил пригласить всех своих друзей. Приняли приглашение и подтвердили участие в вечеринке по случаю дня рождения N человек. Вася даже придумал программу вечера для своих друзей: сначала будет чаепитие с тортом, затем игры и конкурсы. Чтобы рассадить всех своих друзей за столы для чаепития и потратить при этом меньше усилий по сервировке праздничных столов, Вася решил посчитать минимальное их количество. Оказалось, что в распоряжении Васи имеется K4 четырехместных стола и K2 — двухместных. Посчитайте, какое минимальное количество столов потребуется, чтобы рассадить всю компанию.
Формат ввода

В первой и единственной строке вводят числа N, K4, K2 — количество друзей Васи, подтвердивших участие в вечеринке, количество четырехместных столов и количество двухместных столов, которые есть в распоряжении Васи соответственно (1 ≤ N ≤ 1018, 0 ≤ K2, K4 ≤ 1018).
http://www.cyberforum.ru/pascal/thread1555543.html
Формат вывода

Выведите одно число — минимальное количество столов, за которые можно рассадить всех друзей. Если же разместить всех друзей не получится, выведите -1.
Пример

Ввод
10 5 3
Вывод
3
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2016, 17:41
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Посчитайте, какое минимальное количество столов потребуется, чтобы рассадить всю компанию (Turbo Pascal):

Какое минимальное количество карточек придется открыть Пете, чтобы определить какие поменяли местами
Вася выложил в ряд слева направо 100 карточек, на которых написаны числа 1, 2,...

Какое минимальное расстояние должен проплыть Яша, чтобы чтобы выбраться из бассейна на бортик?
Помогите с задачами B, C, D, E, F

Сколько времени потребуется, чтобы количество бактерий превзошло X?
Каждая бактерия делится на две в течении одной минуты. В начальный момент...

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

Какое минимальное расстояние должен проплыть Халк чтобы выбраться из бассейна на бортик?
Халк плавал в бассейне размером N и M метров и устал. в этот момент он...

9
Peoples
1269 / 774 / 730
Регистрация: 06.02.2016
Сообщений: 2,081
Записей в блоге: 15
Завершенные тесты: 4
07.06.2016, 21:36 #2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
program pr;
var
  n, k1, k2: integer;
  r,s, f: integer;
begin
  readln(n, k1, k2);
  r := trunc(n / 4);   // полное количество 4 местных стульев
  if r <= k1 then
  begin
    s := n - r * 4;
    f := trunc(s / 2); // полное 2 местных стульев
    if f<=k2 then
    begin
      writeln(f + r);   // комбинация из стульев
      end else writeln(-1);
  end else writeln(-1);
end.
Добавлено через 11 минут
Можно вот так ещё описать, исключив значения не подходящие для расчёта
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
program pr;
var
  n, k1, k2: integer;
  r,s, f: integer;
begin
  readln(n, k1, k2);
  if (n=1) or (n=2) or (n=3) or (n=4)  then begin writeln(1); exit; end;
  if n=5 then begin writeln(2); exit end ;
  r := trunc(n / 4);   // полное количество 4 местных стульев
  if r <= k1 then
  begin
    s := n - r * 4;
    f := trunc(s / 2); // полное 2 местных стульев
    if f<=k2 then
    begin
      writeln(f + r);   // комбинация из стульев
      end else writeln(-1);
  end else writeln(-1);
end.
Добавлено через 15 минут
Или так
Pascal
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
program pr;
var
  n, k1, k2: integer;
  r,s, f,g: integer;
begin
g:=0;
  readln(n, k1, k2);
if n>5 then
begin
  r := trunc(n / 4);   // полное количество 4 местных стульев
  if r <= k1 then
  begin
    s := n - r * 4;
    f := trunc(s / 2); // полное 2 местных стульев
    if f<=k2 then
    begin
      writeln(f + r);   // комбинация из стульев
      end else writeln(-1);
  end else writeln(-1);
  end 
  else  begin 
  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.
Добавлено через 18 минут
Извиняюсь, вот окончательный вариант
Pascal
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
program pr;
var
  n, k1, k2: integer;
  r,s, f,g: integer;
begin
g:=0;
  readln(n, k1, k2);
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.
1
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
08.06.2016, 17:26  [ТС] #3
Peoples, спасибо,хотя не все тесты прошло.
0
Peoples
1269 / 774 / 730
Регистрация: 06.02.2016
Сообщений: 2,081
Записей в блоге: 15
Завершенные тесты: 4
08.06.2016, 17:28 #4
Varitan, а какие именно не прошла последняя версия кода?
0
Varitan
1 / 1 / 6
Регистрация: 25.01.2016
Сообщений: 107
08.06.2016, 17:57  [ТС] #5
Peoples, к сожалению там не видны условия теста.

Добавлено через 59 секунд
Peoples, там не видны условия теста,но не прошел последний тест.
0
Peoples
1269 / 774 / 730
Регистрация: 06.02.2016
Сообщений: 2,081
Записей в блоге: 15
Завершенные тесты: 4
08.06.2016, 22:55 #6
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Если последний тест не проходится из-за того, что я забыл про эти условия (1 ≤ N ≤ 1018, 0 ≤ K2, K1 ≤ 1018), то дополнил
Pascal
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
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.
Добавлено через 19 минут
Если снова не получится, то замените 32 строчку на
Pascal
1
end else exit;
Если и так тест не пройдёт, то не знаю
0
кот Бегемот
Платежеспособный зверь
8447 / 3886 / 1511
Регистрация: 28.10.2009
Сообщений: 10,062
11.06.2016, 15:11 #7
Peoples,
это не 1018, а 1018 и integer тут не прокатит
1
Peoples
1269 / 774 / 730
Регистрация: 06.02.2016
Сообщений: 2,081
Записей в блоге: 15
Завершенные тесты: 4
11.06.2016, 15:16 #8
кот Бегемот, Возможно, когда-нибудь, люди научатся писать ^ в постановке условий
0
macheanin
0 / 0 / 1
Регистрация: 11.01.2018
Сообщений: 5
05.06.2018, 18:52 #9
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
#include <iostream>
using namespace std;
int main() {
  long long n, k2, k4, res = 0;
  cin>>n>>k4>>k2;
  if (k4 * 4 + k2 * 2 < n){
    cout<<-1;
  }
  else{
    while (n > 0 and k4 > 0){
       n = n - 4;
       k4--;
       res++;
    }
    if (n > 0){
      while (n > 0 and k2 > 0){
        n = n - 2;
        k2--;
        res++;
      }
    }
    cout<<res;
  }
}
Добавлено через 1 минуту
Эта пройдёт 24 теста, а дальше не идёт по времени. Если удастся ускорить, напишите здесь, пож.

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main() {
  long long n, k2, k4, res = 0;
  cin>>n>>k4>>k2;
  if (k4 * 4 + k2 * 2 < n){
    cout<<-1;
  }
  else if (k4 * 4 >= n){
    res = n / 4;
    if (n % 4 > 0){
      res++;
    }
    cout<<res;
  }
  else{
    n = n - k4 * 4;
    res = k4;
    res = res + n / 2 + n % 2;
    cout<<res;
  }
}
Эта пройдет все тесты.
0
кот Бегемот
Платежеспособный зверь
8447 / 3886 / 1511
Регистрация: 28.10.2009
Сообщений: 10,062
08.06.2018, 18:39 #10
Вообще-то эта задача не стоит выеденного яйца Вот её решение для FreePascal
Pascal
1
2
3
4
5
6
var
n, k4, k2: int64;
  begin
readln(n, k4, k2);
  writeln(n div k4+(n mod k4+1) div k2);
end.
0
08.06.2018, 18:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2018, 18:39
Привет! Вот еще темы с решениями:

Какое минимальное расстояние должен проплыть Яша, чтобы выбраться из бассейна на бортик?
ша плавал в бассейне размером NM метров и устал. В этот момент он обнаружил,...

Какое минимальное число букв необходимо заменить в слове Х, с тем, чтобы оно стало перевертышем?
Доброго времени суток! Крайне необходима помощь экспертов в Pascal Вот...

Какое минимальное количество взвешиваний необходимо для определения 8-ой монеты
Задача выглядит вот так: На столе стоят две стопки монет. В одной стопке 8...

На какое минимальное и максимальное количество слогов можно разбить слово
Задача олимпиады! помогите? плиз??? будем называть словам...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru