Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2012, 15:00   #1
Руслан666
Новичок
Джуниор
 
Регистрация: 02.12.2012
Сообщений: 6
По умолчанию четвертая сложная задача

Решите пожалуйста! Буду благодарен!

Для праздничного чаепития необходимо купить n пирожных. В магазине продается всего два вида пирожных, при чем пирожных одного вида осталось a штук, а пирожных другого вида осталось b штук. Пирожные одного вида считаются одинаковыми. Сколькими способами можно купить ровно n пирожных?

Формат вхыодных данных
В первой строке входных данных заисано исло n - количество пирожных, которое нужно купить, во второй и третьей сроке заисаны числа a и b - количество пирожных каждого из двух видов, которые есть в магазине. все числа - целые, от 0 до 100.
Руслан666 вне форума Ответить с цитированием
Старый 02.12.2012, 15:24   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Код:
var
  n, a, b: integer;

begin
  readln(n);
  readln(a);
  readln(b);
  if a + b < n then
    writeln('Impossible')
  else
    writeln(a + b - n + 1);
  readln;
end.
Не уверен.
Ждем Ваши наработки в других темах
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 02.12.2012 в 15:34.
BDA вне форума Ответить с цитированием
Старый 02.12.2012, 15:48   #3
Руслан666
Новичок
Джуниор
 
Регистрация: 02.12.2012
Сообщений: 6
По умолчанию

Спасибо за программу.
Руслан666 вне форума Ответить с цитированием
Старый 02.12.2012, 17:30   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

BDA, не думаю, что приведённая Вами формула даёт правильный ответ.

рассмотрим задачу.
a = 10 b = 10 (имеется по 10 пирожных каждого вида)
n = 3 (нужно купить три пирожных)
различные варианты:
A A A
A A B
A B B
B B B
итого, всего 4-ре варианта



p.s. всё вышесказанное является ИМХО,
без всяких претензий на истину в последней инстанции...
возможно, это я понял условия задачи неверно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.12.2012, 18:12   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Серж, ага. Всё верно.
Тут наверное перебор, с учетом условий конечности A и B

ADD
Вроде работает :
Код:
var
        a, b, n, i, t, count: Integer;
        s : string;

begin
        ReadLn (a, b, n);

        if a+b < n then
                WriteLn ('Impos')
        else begin
                i := 1;
                s := '';
                for i := 1 to a do
                        if Length(s) = n then
                                Break
                        else
                        s := s + '0';
                t := Length(s);

                for i := 1 to b do
                        if Length(s) = n then
                                Break
                        else
                                s := s + '1';
                i := t; count := 1;
                while s[1] <> '1' do begin
                        s[i] := '1';
                        Dec(i);
                        Inc (count)
                end;
        end;
        WriteLn(count)
end.

Последний раз редактировалось Poma][a; 02.12.2012 в 18:23.
Poma][a вне форума Ответить с цитированием
Старый 02.12.2012, 18:13   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Serge_Bliznykov, Вы правы. Я совсем забыл рассмотреть случай, когда a или/и b больше n.
Код:
var
  n, a, b: integer;

function min(a, b: integer): integer;
begin
  if a > b then
    min := b
  else
    min := a;
end;

function max(a, b: integer): integer;
begin
  if a > b then
    max := a
  else
    max := b;
end;

begin
  readln(n);
  readln(a);
  readln(b);
  if a + b < n then
    writeln('Impossible')
  else
    writeln(min(a, n) - max(n - b, 0) + 1);
  readln;
end.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.12.2012, 18:30   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

BDA, красиво

И без циклов..
Я - то, тож пытался додумкать, как по-красивше сделать, но увы.
Poma][a вне форума Ответить с цитированием
Старый 02.12.2012, 18:42   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А так тоже вроде оно: min(a,n)+min(b,n)-n+1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 28.09.2019, 19:04   #9
Eugeny19841
Новичок
Джуниор
 
Регистрация: 28.09.2019
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А так тоже вроде оно: min(a,n)+min(b,n)-n+1
Я прочитал, что это формула определения длины отрезка, но не нашел ее нигде в интернете. Подскажите, Пожалуйста где можно найти и почему +1 в конце?
Eugeny19841 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не сложная задача maxwel6064 Паскаль, Turbo Pascal, PascalABC.NET 1 02.01.2012 13:56
задача сложная Tolian92 Паскаль, Turbo Pascal, PascalABC.NET 2 08.12.2011 15:20
Сложная задача(( альбертоо Паскаль, Turbo Pascal, PascalABC.NET 1 07.12.2011 16:57
Сложная задача. ВДПУ Помощь студентам 4 07.11.2011 22:34
Сложная задача asale Microsoft Office Excel 6 07.04.2009 20:36