Форум программистов, компьютерный форум CyberForum.ru

Codeforces.Double Cola - C++

Восстановить пароль Регистрация
 
max_besheniy
25 / 25 / 1
Регистрация: 21.11.2013
Сообщений: 208
03.12.2013, 20:46     Codeforces.Double Cola #1
Условие задачи таково:
Шелдон, Леонард, Пенни, Раджеш и Говард стоят в очереди к автомату по продаже баночек с напитком «Double Cola», других людей в очереди нет. Первый в очереди (Шелдон) покупает баночку, выпивает ее содержимое и раздваивается! Получившиеся два Шелдона встают в конец очереди. Затем следующий в очереди (Леонард) покупает баночку, выпивает и встает в конец очереди в двойном экземпляре, и так далее. Этот процесс продолжается до бесконечности.

Например, третью баночку колы выпьет Пенни, и очередь будет выглядеть так: Раджеш, Говард, Шелдон, Шелдон, Леонард, Леонард, Пенни, Пенни.

Напишите программу, которая выведет имя человека, выпившего n-ую баночку.

Обратите внимание, что в самом начале очередь выглядит так: Шелдон, Леонард, Пенни, Раджеш, Говард. Первым человеком является Шелдон.
Пробовал решать сам, затем посмотрел разбор, но все равно не получилось. Надеюсь на помощь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
max_besheniy
25 / 25 / 1
Регистрация: 21.11.2013
Сообщений: 208
05.12.2013, 19:37  [ТС]     Codeforces.Double Cola #2
Пожалуйста помогите решить!
hwmlex
 Аватар для hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
05.12.2013, 20:27     Codeforces.Double Cola #3
Довольно легко реализуется через deque. Попробую сейчас написать.
ZaMaZaN4iK
Мой лучший друг-отладчик!
 Аватар для ZaMaZaN4iK
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
05.12.2013, 20:33     Codeforces.Double Cola #4
hwmlex, надо бы на ограничения глянуть.Может так получиться, что номер баночки будет довольно большим => дек может разрастись до таких размеров, что будет вылетать по ML
hwmlex
 Аватар для hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
05.12.2013, 20:34     Codeforces.Double Cola #5
ТС, какие ограничения на N?
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
05.12.2013, 20:42     Codeforces.Double Cola #6
сначала очередь из пяти человек
1
2
3
4
5
потом из 10
1
1
2
2
3
3
4
4
5
5
потом из 20
1
1
1
1
2
2
2
2
3
3
3
3
4
4
4
4
5
5
5
5
значит если число до банок до 5
то остаток от деления на 5
если от 5 до 15
то вычитаем пять( это первая очередь) остаток от деления на 10 и делим пополам
если от 15 до 35 то то вычитаем 15(первые две очереди) остаток от деления на 20 и делим на четыре
рассуждения понятны?
hwmlex
 Аватар для hwmlex
41 / 41 / 3
Регистрация: 30.01.2013
Сообщений: 133
05.12.2013, 20:49     Codeforces.Double Cola #7
ValeryS, Они удваиваются и встают в конец очереди.
max_besheniy
25 / 25 / 1
Регистрация: 21.11.2013
Сообщений: 208
05.12.2013, 20:53  [ТС]     Codeforces.Double Cola #8
Ограничение n<=10^9
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
05.12.2013, 21:57     Codeforces.Double Cola #9
примерно так
C++
1
2
3
4
5
6
7
8
9
10
11
12
char * name[5]={"Шелдон", "Леонард", "Пенни", "Раджеш", "Говард"};
n--;
int m=0;
while(n>0)
{
  n-=5*pow(2.0,m);
 m++;
}
if(n==0)
 printf("Шелдон");
else
  printf("%s",name[((n%(pow(2.0,m-1)*5))/pow(2.0,m-1))]);
Добавлено через 2 минуты
Цитата Сообщение от hwmlex Посмотреть сообщение
ValeryS, Они удваиваются и встают в конец очереди.
и что?
я показал как очередь будет выглядеть после цикла
первый цикл это пять банок
второй десять и т.д
в общем случае
5*2i
i итерация цикла

Добавлено через 5 минут
пардон наврал маненько
n будет портися в цикле значит её нужно запомнить где то

Добавлено через 55 минут
проверяйте
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
25
26
27
#include <iostream>
 
 
int main()
{
    char * name[5]={"Cheldon", "Leonard", "Penny", "Radjest", "Govard"};
    int n;
    std::cout<<"enter namber"<<std::endl;
    std::cin>>n;
    
    while(n>0)
    {
    int s=5;
    int r=1;
    int k=0;
    while(n-s>0)
    {
           k=s;
    r*=2;
    s+=r*5;  
    }
    std::cout<<name[(n-k-1)/r]<<std::endl;
    std::cout<<"enter namber"<<std::endl;
    std::cin>>n;
    }
  return 0;
}
если ввести отрицательное число или 0 выход из программы
max_besheniy
25 / 25 / 1
Регистрация: 21.11.2013
Сообщений: 208
07.12.2013, 20:18  [ТС]     Codeforces.Double Cola #10
Не работает. Отправил на кодфорс, там не прошел 8 тест. Пожалуйста скиньте нормальный код
ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
07.12.2013, 20:25     Codeforces.Double Cola #11
Цитата Сообщение от max_besheniy Посмотреть сообщение
Не работает. Отправил на кодфорс, там не прошел 8 тест.
что есть 8 тест?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.12.2013, 20:29     Codeforces.Double Cola
Еще ссылки по теме:

Почему перестает работать программа при замене double на long double? C++
Преобразовать 2 числа int в 1 число float(double) | double int1.int2 C++
Почему мы пишем double x (double y)? а не через запятую double x,y C++

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

Или воспользуйтесь поиском по форуму:
max_besheniy
25 / 25 / 1
Регистрация: 21.11.2013
Сообщений: 208
07.12.2013, 20:29  [ТС]     Codeforces.Double Cola #12
Спасибо, уже не надо. Сам решил
Yandex
Объявления
07.12.2013, 20:29     Codeforces.Double Cola
Ответ Создать тему
Опции темы

Текущее время: 02:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru