Напиться пива по-быстрому
От: Pushkin Россия www.linkbit.com
Дата: 04.04.03 08:16
Оценка: 41 (6) :))) :)
Там в соседнем форуме пост проскочил,
от которого многим стало малость неловко
Предлагаю быстренько решить тоже простую,
но чуть более забавную задачу

У меня в кармане s>=0 рублей.
Бутылка пива стоит x>=0 рублей.
Обратно их берут по у<x рублей.
Написать на Си выражение для
числа бутылок, которое я смогу выпить.

PS
На эти деньги

Re: Напиться пива по-быстрому
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 04.04.03 08:23
Оценка:
Здравствуйте, Pushkin, Вы писали:

P>У меня в кармане s>=0 рублей.

P>Бутылка пива стоит x>=0 рублей.
P>Обратно их берут по у<x рублей.
P>Написать на Си выражение для
P>числа бутылок, которое я смогу выпить.


int s = 100; // 100 рублев в кармане
int x = 8; // 8 рублев за бутылку
int y = 1; // за сколько принимают обратно
int result = 0; // результат

while( (s =((s-x)+y)) > 0 )
  result++;


Я правильно все понял?

З.Ы. Сорри за целочисленную арифметику
Re: Напиться пива по-быстрому
От: UgN  
Дата: 04.04.03 08:30
Оценка:
Здравствуйте, Pushkin, Вы писали:


const unsigned short BeerPrice        = 20;
const unsigned short BottleValue      = 2;

unsigned long BeerInStomach( unsigned short MoneyInPocket )
{
    static Bottles = 0;
    if( MoneyInPocket < BeerPrice ) return Bottles;
    Bottles += MoneyInPocket / BeerPrice;
    return BeerInStomach( Bottles * BottleValue +  MoneyInPocket % BeerPrice );
};
Re: Напиться пива по-быстрому
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.04.03 08:34
Оценка:
Здравствуйте, Pushkin, Вы писали:

Не выражение, конечно, но удовольствие получил

#include <stdio.h>

#define bottle_price 2
#define beer_price 15

int Beer(int money, int beer_already_drunk)
{
    int beer_bought;
    
    if (money < beer_price)    // денег мало
        return beer_already_drunk;
        
    beer_bought = money / beer_price; // сколько пива можно купить
    money -= beer_bought * beer_price; // сколько денег осталось
    beer_already_drunk += beer_bought; // выпили пиво
    money += beer_bought * bottle_price; // сдали бутылки
    
    return Beer(money, beer_already_drunk); // "берем производную"
}

int main()
{
    printf("%d\n", Beer(100, 0));
    return 0;
}
... << RSDN@Home 1.0 beta 6a >>
Re: Напиться пива по-быстрому
От: MichaelP  
Дата: 04.04.03 08:34
Оценка: :)
Здравствуйте, Pushkin, Вы писали:

P>Там в соседнем форуме пост проскочил,

P>от которого многим стало малость неловко
P>Предлагаю быстренько решить тоже простую,
P>но чуть более забавную задачу

P>

P>У меня в кармане s>=0 рублей.
P>Бутылка пива стоит x>=0 рублей.
P>Обратно их берут по у<x рублей.
P>Написать на Си выражение для
P>числа бутылок, которое я смогу выпить.

P>PS
P>На эти деньги

А деньги на "быстрое" время я могу одалживать?
Re[2]: Напиться пива по-быстрому
От: UgN  
Дата: 04.04.03 08:35
Оценка:
Поправка
unsigned short BeerInStomach( unsigned short MoneyInPocket )
{
    static unsigned short Bottles = 0;
        . . .
};
Re[2]: Напиться пива по-быстрому
От: Pushkin Россия www.linkbit.com
Дата: 04.04.03 08:38
Оценка:
Здравствуйте, Flamer, Вы писали:

F>

F>
F>int s = 100; // 100 рублев в кармане
F>int x = 8; // 8 рублев за бутылку
F>int y = 1; // за сколько принимают обратно
F>int result = 0; // результат

F>while( (s =((s-x)+y)) > 0 )
F>  result++;

F>


F>Я правильно все понял?


Ответ ты конечно получишь, но за O(S)
Я имел в виду выражение.
Три названия для переменных даны, надо просто расставить арифметические знаки!
Re: Напиться пива по-быстрому
От: mrhru Россия  
Дата: 04.04.03 08:40
Оценка: 24 (1)
Здравствуйте, Pushkin, Вы писали:

P>

P>У меня в кармане s>=0 рублей.
P>Бутылка пива стоит x>=0 рублей.
P>Обратно их берут по у<x рублей.
P>Написать на Си выражение для
P>числа бутылок, которое я смогу выпить.

P>PS
P>На эти деньги


Если можно пользоваться виртуальными пустыми бутылками, то
  result = s / (x - y);


Мышки плакали и кололись, продолжая жрать кактусы, — но не из денег, а только б вечность проводить...
Re[2]: Напиться пива по-быстрому
От: Pushkin Россия www.linkbit.com
Дата: 04.04.03 08:45
Оценка:
Здравствуйте, MichaelP, Вы писали:

MP>А деньги на "быстрое" время я могу одалживать?


Не-а, кругом одни жлобы
Re[2]: Напиться пива по-быстрому
От: Pushkin Россия www.linkbit.com
Дата: 04.04.03 08:47
Оценка:
Здравствуйте, mrhru, Вы писали:

M>Если можно пользоваться виртуальными пустыми бутылками, то


Как это?
Может и пиво пить виртуальное?
(Ответ будет содержать мнимую часть )
Re[2]: Напиться пива по-быстрому
От: Михаил Можаев Россия www.mozhay.chat.ru
Дата: 04.04.03 08:51
Оценка: 53 (3)
Здравствуйте, mrhru, Вы писали:

M>Если можно пользоваться виртуальными пустыми бутылками, то

M>
M>  result = s / (x - y);
M>


Чтобы избежать виртуальных бутылок:
(s - y) / (x - y);


... << RSDN@Home 1.0 beta 6a >>
Re[3]: Напиться пива по-быстрому
От: mrhru Россия  
Дата: 04.04.03 08:56
Оценка: 24 (1)
Здравствуйте, Pushkin, Вы писали:

P>Здравствуйте, mrhru, Вы писали:


M>>Если можно пользоваться виртуальными пустыми бутылками, то


P>Как это?


P>Может и пиво пить виртуальное?

P>(Ответ будет содержать мнимую часть )

Это просто. Если на последнее пиво не хватает ровно стоимости пустой бутылки,
то шарим рукой по помойке, находим пустую бутылку, сдаем её, покупаем пиво, пустую
бутылку аккуратно возвращаем на помойку.
Мышки плакали и кололись, продолжая жрать кактусы, — но не из денег, а только б вечность проводить...
Re[3]: Напиться пива по-быстрому
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 04.04.03 08:58
Оценка:
Здравствуйте, Pushkin, Вы писали:

[]

P> Ответ ты конечно получишь, но за O(S)

P>Я имел в виду выражение.
P>Три названия для переменных даны, надо просто расставить арифметические знаки!

Если переменные можно использовать несколько раз, то вот (так, навскидку):


int s = 100; // 100 рублев в кармане
int x = 8; // 8 рублев за бутылку
int y = 1; // за сколько принимают обратно

int result = (s / x) + ((s % x) + ((s/x)*y))/x;


Или я чего опять недопонял? И чур не пинать
Re: Напиться пива по-быстрому
От: MichaelP  
Дата: 04.04.03 08:59
Оценка: 56 (4)
Здравствуйте, Pushkin, Вы писали:
P>

P>У меня в кармане s>=0 рублей.
P>Бутылка пива стоит x>=0 рублей.
P>Обратно их берут по у<x рублей.
P>Написать на Си выражение для
P>числа бутылок, которое я смогу выпить.

P>PS
P>На эти деньги


Раз денег никто не одалживает...

Рассмотрим ону итерацию (выпил сдал). После итерации у нас осталось денег s(i) = s(i-1)-(x-y)*n(i), где n(i)-число выпитых бутылок. Если s(i)<x — итерации продолжаются , если меньше — все .

Т.е. задача сводится к следующей:
Сколько раз из первоначальной суммы мы можем вычесть (x-y) пока остаток не станет меньше x.
Сразу вычтем из s x. Тогда задача сведется к эквивалентной:
Сколько раз из (s-x) мы можем вычесть (x-y) пока остаток не станет меньше 0.

Решение очевидно: (s-x)/(x-y)+1
Re[2]: Напиться пива по-быстрому
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 04.04.03 09:02
Оценка:
Здравствуйте, MichaelP, Вы писали:

[]

MP>Решение очевидно: (s-x)/(x-y)+1


Блин, а ведь похоже на правду А я-то наворотил
Re[2]: Напиться пива по-быстрому
От: SiAVoL Россия  
Дата: 04.04.03 09:04
Оценка:
Здравствуйте, Flamer, Вы писали:

F>
F>int s = 100; // 100 рублев в кармане
F>int x = 8; // 8 рублев за бутылку
F>int y = 1; // за сколько принимают обратно
F>int result = 0; // результат

F>while( (s =((s-x)+y)) > 0 )
F>  result++;

F>


Это верно только если продают пиво и принимают бутылки в одном месте, что зачастую неверно
С учетом того, что сначало должно хватить денег на пиво, а потом мы поимеем со сдачи пустых... И еще, цены на пиво какие-то нереальные (по поводу бутылок ничего сказать не могу)
int s = 100; // рублев в кармане
int x = 20; // рублев за бутылку
int y = 1; // за сколько принимают обратно
int result = 0; // результат

while( (s -= x) > 0 )
{
  result++;
  s += y;
}

Гуляем !
... << RSDN@Home 1.0 beta 6a >>
Re[2]: Напиться пива по-быстрому
От: MichaelP  
Дата: 04.04.03 09:44
Оценка:
MP>Решение очевидно: (s-x)/(x-y)+1

Извиняюсь, не заметил, что Михаил Можаев дал правильную формулу
Автор: Михаил Можаев
Дата: 04.04.03
раньше меня
Re[3]: А понять это можно так...
От: Pushkin Россия www.linkbit.com
Дата: 04.04.03 10:18
Оценка: 7 (1)
Здравствуйте, Михаил Можаев, Вы писали:

ММ>
(s - y) / (x - y);


Пойдём и купим пустую бытылку — денег останется (s-y).
После этого будем проводить операцию сдать-купить,
каждый раз деньги убывают на (x-y).
Re[3]: Напиться пива по-быстрому
От: Кодт Россия  
Дата: 07.04.03 08:13
Оценка:
Здравствуйте, MichaelP, Вы писали:

MP>>Решение очевидно: (s-x)/(x-y)+1


MP>Извиняюсь, не заметил, что Михаил Можаев дал правильную формулу
Автор: Михаил Можаев
Дата: 04.04.03
раньше меня


Зато ты человечьим языком объяснил.
Перекуём баги на фичи!
Re: Напиться пива по-быстрому
От: Акул www.kyrs.ru
Дата: 09.04.03 18:47
Оценка: :)))
Здравствуйте, Pushkin, Вы писали:

P>Там в соседнем форуме пост проскочил,

P>от которого многим стало малость неловко
P>Предлагаю быстренько решить тоже простую,
P>но чуть более забавную задачу

P>

P>У меня в кармане s>=0 рублей.
P>Бутылка пива стоит x>=0 рублей.
P>Обратно их берут по у<x рублей.
P>Написать на Си выражение для
P>числа бутылок, которое я смогу выпить.

P>PS
P>На эти деньги


Помню препод по мат основам информации расказывал:
1) просто пьянка — это берём деньги и пропиваем
2) производная пьянка — сдаём бутылки и пьём дальше (уже хорошо)
3) пьянка удалась — вторая производная не равна нулю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.