Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/2345: Рейтинг темы: голосов - 2345, средняя оценка - 4.54
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
1

Задачи для тренировки и лучшего понимания

15.07.2010, 05:53. Показов 463032. Ответов 1272
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ребят. Кто-нибудь может дать задачу для тренировки? Приблизительно по всему курсу С++. Буду благодарен за сложную задачу, но которую способен сделать новичок-любитель. Затраты сил-времени не важно. Главное, чтобы это было интересно и не слишком рутинно. + Если найдется человек который даст задачу просьба помогать с кодом, который я буду себя скидывать. Не переписывать за меня, но указывать на ошибки и желательно объяснять. Заранее спасибо.

Список задач, решение которых присутствует в данной теме:
44
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.07.2010, 05:53
Ответы с готовыми решениями:

Элементарные программы, для лучшего понимания языка...
Здравствуйте. Вот сегодня решил что пора изучать с++. Есть пару задач. Начал решать и уже на первой...

Задачи для тренировки и лучшего понимания языка
Предлагаю в этой теме размещать задачи, которые помогут новичкам (и не только) более детально...

Литература для лучшего понимания сути программирования
Привет! Подскажите литературу, которая поможет разобраться в сути самого процесса программирования,...

Набор задачь для тренировки и улучшения понимания программирования
Добрый вечер всем. Если кто знает модскажите где можно найти подобный набор задачь...

1272
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.01.2011, 17:45 1001
Author24 — интернет-сервис помощи студентам
valeriikozlov, ааа, всё, теперь понял. Надо постоянно отслеживать, можно ли ещё добраться до угла, двигаясь только вниз и влево, и если нет, откатываться назад (при одном варианте решение, возможно, есть алгоритм без отката).

Добавлено через 4 минуты
А такой алгоритм:
Проверяем не достигнем ли мы за один ход по диагонали угла. Если да - победа за первым. Если нет, и при максимальном движении по диагонали попадаем на нижнюю границу доски - побеждает второй (первый двигает по диагонали до этой границы, а второй - вдоль неё и до угла), а если на левую границу - побеждает первый (первый двигает по диагонали на, по сути, любое количество клеток, ограниченное одним рядом клеток по левой границе, второй двигает до максимума вниз, а первый вдоль нижней границы до угла).

Добавлено через 3 минуты
Не, что-то левое, под ваши примеры не подходит...

Добавлено через 3 минуты
Похоже это я тупой... Но суть задания не доходит. Как будто не хватает каких-то ограничений. Потому что так, как я сейчас понял задание, выиграть всегда может как первый, так и второй игрок...
Балин, я чего-то не понимаю...

Добавлено через 3 минуты
Во, я не понимаю, что есть "правильная игра"? Я знаю такой тип задачек, где оговорены условия, но чего-то делать нельзя, и определить надо, кто при правильной игре выиграет. Здесь вроде всё то же самое, только вот не пойму я, чего делать-то нельзя?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
09.01.2011, 18:08 1002
Цитата Сообщение от silent_1991 Посмотреть сообщение
Во, я не понимаю, что есть "правильная игра"?
Правильная игра, это когда каждый игрок своим ходом старается выиграть (и выигрывает, если ситуация не проигрышная). Ход мыслей у Вас в правильном направлении.... Еще чуть-чуть и додумаетесь.
По своему опыту: лучше взять листок в клетку и начиная с клетки (1, 1) подумать кто выигрывает с какой клетки (для достижения истины не так уж много клеток нужно рассмотреть).
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
09.01.2011, 18:24 1003
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Правильная игра, это когда каждый игрок своим ходом старается выиграть
Но не помешать выиграть другому? У него такой задачи нет?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
09.01.2011, 18:55 1004
Цитата Сообщение от silent_1991 Посмотреть сообщение
Но не помешать выиграть другому? У него такой задачи нет?
Ну по-моему это одно и тоже. Один игрок делая ход и ставя этим ходом другого игрока в пригрышную позицию, тем самым обеспечивает себе победу (т.е. такой ход и называется правильным ходом).
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.01.2011, 02:22  [ТС] 1005
Функция Шпрага-Гранди
Разве не та же тема?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.01.2011, 04:19 1006
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//////////////////////////////////////////////////////////////////////////////////////
//Рассмотрим бесконечную вправо и вверх шахматную доску, на которой стоит ферзь. 
//Двое по очереди двигают этого ферзя. Разрешается двигать ферзя только вниз, 
//влево или по диагонали вниз влево. Цель игры – задвинуть ферзя в угол, 
//то есть клетку с координатами (1, 1). На рисунке показаны разрешенные движения ферзя.
//------------------------------------------------------------------------------------
//Требуется написать программу, которая найдет номер игрока, который выиграет 
//при правильной игре.
//Входные данные
//------------------------------------------------------------------------------------
//Входной файл INPUT.TXT содержит координаты ферзя перед первым ходом 
//- два числа M и N, записанные через пробел (1 <= M, N <= 250).
//Выходные данные
//------------------------------------------------------------------------------------
//Выходной файл OUTPUT.TXT должен содержать найденный номер победителя.
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <iostream>
#include <set>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::set<int>  T_int_set;
//////////////////////////////////////////////////////////////////////////////////////
const int  M_MIN = 1;
const int  N_MAX = 250;
//////////////////////////////////////////////////////////////////////////////////////
bool  first_is_winner(int  m, int  n)
{
    if(n > m)
    {
        std::swap(m, n);
    }
    //Утверждение: n <= m.
    //По условию фукнция Шпрага-Гранди равна нулю в угловой клетке.
    //Найдем остальные клетки с первой координатой <= n, в которых она равна нулю.
 
    int Y[N_MAX] = {0};
    T_int_set  values;    
    T_int_set  diagonals;    
    for(int i = 0; i < n; ++i)
    {
        if(   i > 0 
           && Y[i] == 0)
        {
            while(   values     .count(Y[i])
                  || diagonals  .count(Y[i] - i))
            {
                ++Y[i];
            }
 
            if(Y[i] < n)
            {
                Y[Y[i]] = i;
            }
        }
        values     .insert(Y[i]);        
        diagonals  .insert(Y[i] - i);
    }
    return Y[n - 1] != m - 1;
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    std::cout << "Введите координаты ферзя (M_MIN <= M, N <= N_MAX):"
              << std::endl;
    int m = 0;
    do
    {
        std::cout << "M = ";
        std::cin >> m;
    }while(m < M_MIN);
 
    int n = 0;
    do
    {
        std::cout << "N = ";
        std::cin >> n;
    }while(N_MAX < n);
 
    std::cout << "Победит "
              << (first_is_winner(m, n) ? 1 : 2)
              << "-й игрок."
              << std::endl;
}
1
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 07:58 1007
Mr.X, Ваш код прошел все тесты.
ForEveR, Та же самая получается тема.
Теперь у меня вопрос: раз есть правильное решение, разбор этой задачи нужно делать?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
10.01.2011, 07:59 1008
valeriikozlov, можно, вряд ли вы предполагали такое решение))) (честно говоря, мне лень было думать))) Если бы подумал - решил бы, а так - посмотрю ваш вариант)
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 08:35 1009
silent_1991, Алгоритм решения у меня такой (я привожу доску не бесконечную а 8*8, но все будет понятно):
Клетки обозначенные 0 - это клетки неизвестные (неизвестно, кто победит если с них начать). Клетка с координатами 0 0 - это клетка нижняя левая.
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Т.к. всегда начинает 1 игрок, то логично предположить:
1 0 0 0 0 0 0 1
1 0 0 0 0 0 1 0
1 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0
1 0 0 1 0 0 0 0
1 0 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 1 1 1 1 1
Т.е. все клетки обозначенные 1 - это клетки из которых если начать, то выигрывает 1 игрок.
Теперь обращаем внимание на клетки с координатами (3,2) и (2,3) - Если первый игрок начинает ходить с этих клеток, то он сможет пойти только на те клетки где выигрывает "первый начинающий ходить" игрок. В данном случае после его хода, "первым начинающим ходить" будет второй. Т.е. клетки (3,2) и (2,3) - это клетки выигрышные для второго игрока. Получаем:
1 0 0 0 0 0 0 1
1 0 0 0 0 0 1 0
1 0 0 0 0 1 0 0
1 0 0 0 1 0 0 0
1 0 0 1 0 0 0 0
1 2 1 0 0 0 0 0
1 1 2 0 0 0 0 0
1 1 1 1 1 1 1 1
(Еще раз повторюсь, что начинает всегда ходить 1 игрок. А 1 на поле означает что из этой клетки если начинается игра выиграет 1 игрок. А 2 на поле означает, что из этой клетки если начинается игра выиграет 2 игрок)
Теперь рассмотрим клетки (пока неизвестные) вертикальные, горизонтальные и по диагонали к полученным 2-кам. Если игра начинается из них, то выигает всегда 1 игрок. При правильной игре 1 игрок всегда сделает ход в клетку с 2-кой (тем самым обрекает противника на поражение). Значит имеем:
1 1 1 0 0 0 1 1
1 1 1 0 0 1 1 1
1 1 1 0 1 1 1 0
1 1 1 1 1 1 0 0
1 1 1 1 1 0 0 0
1 2 1 1 1 1 1 1
1 1 2 1 1 1 1 1
1 1 1 1 1 1 1 1
Следующие на рассмотрении клетки (6,4) (4,6) (пока неизвестные)
Если первый игрок начинает ходить из этих клеток, то из них он может попасть только в клетки, в которых выигрывает только "первый начинающий ходить". В данном случае это будет игрок 2.
Значит получаем:
1 1 1 0 0 0 1 1
1 1 1 0 0 1 1 1
1 1 1 2 1 1 1 0
1 1 1 1 1 1 0 0
1 1 1 1 1 2 0 0
1 2 1 1 1 1 1 1
1 1 2 1 1 1 1 1
1 1 1 1 1 1 1 1
Затем снова заполняем (пока неизвестные) вертикальные, горизонтальные и по диагонали к полученным 2-кам, единицами (выше сказано почему):
1 1 1 1 0 1 1 1
1 1 1 1 1 1 1 1
1 1 1 2 1 1 1 1
1 1 1 1 1 1 1 0
1 1 1 1 1 2 1 1
1 2 1 1 1 1 1 1
1 1 2 1 1 1 1 1
1 1 1 1 1 1 1 1
Следующие на рассмотрении точки с координатами (8,5) и (5,8) - там значения равны 2.
и т.д.
Значения: (1 <= M, N <= 250) не такие уж и большие. Все заполнение матрицы пройдет быстро.
3
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
10.01.2011, 10:38 1010
valeriikozlov, именно это я и имел в виду, что задача математическая (аналитическая), ибо решается на бумажке. Т.е. будь ты хоть 100 раз программист, но если ты на бумажке её не решил, то программу не напишешь. Наверное я неправильным термином пользуюсь, но под "математической" задачей подразумеваю именно такие
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 12:57 1011
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. будь ты хоть 100 раз программист, но если ты на бумажке её не решил, то программу не напишешь.
с этим согласен полностью. Сначало должен родится алгоритм решения такой задачи. А потом его реализация кодом.
Насчет терминов:
Цитата Сообщение от Evg Посмотреть сообщение
Наверное я неправильным термином пользуюсь
может быть и правильный термин. По моему мнению аналитика и математика очень сильно связаны.
1
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
10.01.2011, 13:18 1012
Цитата Сообщение от valeriikozlov Посмотреть сообщение
аналитика и математика очень сильно связаны
Так и есть, в частности, аналитическое решение - решение, полученное с использованием логических заключений и математических выкладок, т.е. решение, которое, по сути, описывается формулой (или группой формул), и, что самое важное, даёт точный ответ (в отличие от численного решения, в котором главное не формула, а итерации, и отвёт даётся только с некоторой точностью).
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 13:39 1013
Как говорится "раз пошла такая пьянка ..." , то выкладываю еще одну задачу, на мой взгляд интересную:
Головоломка
(Время: 1 сек. Память: 16 Мб Сложность: 35%)

Петя разгадывает головоломку, которая устроена следующим образом. Дана квадратная таблица размера NxN, в каждой клетке которой записана какая-нибудь латинская буква. Кроме того, дан список ключевых слов. Пете нужно, взяв очередное ключевое слово, найти его в таблице. То есть найти в таблице все буквы этого слова, причем они должны быть расположены так, чтобы клетка, в которой расположена каждая последующая буква слова, была соседней с клеткой, в которой записана предыдущая буква (клетки называются соседними, если они имеют общую сторону — то есть соседствуют по вертикали или по горизонтали). Например, на рисунке показано, как может быть расположено в таблице слово olympiad.
Doc3.doc
Когда Петя находит слово, он вычеркивает его из таблицы. Использовать уже вычеркнутые буквы в других ключевых словах нельзя. После того, как найдены и вычеркнуты все ключевые слова, в таблице остаются еще несколько букв, из которых Петя должен составить слово, зашифрованное в головоломке.

Помогите Пете в решении этой головоломки, написав программу, которая по данной таблице и списку ключевых слов выпишет, из каких букв Петя должен сложить слово, то есть какие буквы останутся в таблице после вычеркивания ключевых слов.
Входные данные

Во входном файле INPUT.TXT записаны два числа N (1<=N<=10) и M (0<=M<=100). Следующие N строк по N заглавных латинских букв описывают ребус. Следующие M строк содержат слова. Слова состоят только из заглавных латинских букв, каждое слово не длиннее 100 символов. Гарантируется, что в таблице можно найти и вычеркнуть по описанным выше правилам все ключевые слова.
Выходные данные

В выходной файл OUTPUT.TXT выведите в алфавитном порядке оставшиеся в таблице буквы.
Примеры:
INPUT.TXT
5 3
POLTE
RWYMS
OAIPT
BDANR
LEMES
OLYMPIAD
PROBLEM
TEST
OUTPUT.TXT
AENRSW

Следующий пример:
INPUT.TXT
3 2
ISQ
ABC
IQW
I
IS
OUTPUT.TXT
ABCQQW
1
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.01.2011, 16:36 1014
Задача слишком легкая
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 16:37 1015
Хохол, точно.
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
10.01.2011, 18:54 1016
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
//////////////////////////////////////////////////////////////////////////////////////
//Петя разгадывает головоломку, которая устроена следующим образом. Дана квадратная 
//таблица размера NxN, в каждой клетке которой записана какая-нибудь латинская буква. 
//Кроме того, дан список ключевых слов. Пете нужно, взяв очередное ключевое слово, 
//найти его в таблице. То есть найти в таблице все буквы этого слова, причем они 
//должны быть расположены так, чтобы клетка, в которой расположена каждая последующая 
//буква слова, была соседней с клеткой, в которой записана предыдущая буква 
//(клетки называются соседними, если они имеют общую сторону — то есть соседствуют 
//по вертикали или по горизонтали). Например, на рисунке показано, как может быть 
//расположено в таблице слово olympiad. 
//
//Когда Петя находит слово, он вычеркивает его из таблицы. Использовать уже вычеркнутые 
//буквы в других ключевых словах нельзя. После того, как найдены и вычеркнуты все 
//ключевые слова, в таблице остаются еще несколько букв, из которых Петя должен 
//составить слово, зашифрованное в головоломке. 
//
//Помогите Пете в решении этой головоломки, написав программу, которая по данной таблице 
//и списку ключевых слов выпишет, из каких букв Петя должен сложить слово, то есть 
//какие буквы останутся в таблице после вычеркивания ключевых слов. 
//------------------------------------------------------------------------------------
//ВХОДНЫЕ ДАННЫЕ
//Во входном файле INPUT.TXT записаны два числа N (1<=N<=10) и M (0<=M<=100). 
//Следующие N строк по N заглавных латинских букв описывают ребус. Следующие M строк 
//содержат слова. Слова состоят только из заглавных латинских букв, каждое слово 
//не длиннее 100 символов. Гарантируется, что в таблице можно найти и вычеркнуть
//по описанным выше правилам все ключевые слова. 
//------------------------------------------------------------------------------------
//ВЫХОДНЫЕ ДАННЫЕ
//В выходной файл OUTPUT.TXT выведите в алфавитном порядке оставшиеся в таблице буквы.
//////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <fstream>
#include <iostream>
#include <set>
#include <string>
//////////////////////////////////////////////////////////////////////////////////////
typedef std::string            T_str;
typedef T_str::value_type      T_symb;
typedef std::multiset<T_symb>  T_symb_multiset;
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
 
    const T_str    FILE_IN_NAME("input.txt");    
    std::ifstream  file_in(FILE_IN_NAME.c_str());    
    if (!file_in) 
    {        
        std::cerr << "Невозможно открыть файл \"" 
                  << FILE_IN_NAME << "\""
                  << std::endl;
        exit(EXIT_FAILURE);
    }
 
    int  n = 0;
    file_in >> n;
    int  m = 0;
    file_in >> m;    
 
    T_symb_multiset  rebus_letters;
    for(int i = 0; i < n + 1; ++i)
    {
        T_str  rebus_str_cur;
        getline(file_in, rebus_str_cur);
        if(i)
        {
            rebus_letters.insert(rebus_str_cur.begin(), rebus_str_cur.end());
        }        
    }
    
    T_symb_multiset  words_letters;
    for(int i = 0; i < m; ++i)
    {
        T_str  word_cur;
        getline(file_in, word_cur);
        words_letters.insert(word_cur.begin(), word_cur.end());
    }
 
    T_str  remained_letters_str;
    std::set_difference(rebus_letters.begin(), rebus_letters.end(), 
                        words_letters.begin(), words_letters.end(), 
                        std::back_inserter(remained_letters_str));
 
    const T_str    FILE_OUT_NAME("output.txt");    
    std::ofstream  file_out(FILE_OUT_NAME.c_str());    
    if (!file_out) 
    {        
        std::cerr << "Невозможно открыть файл \"" 
                  << FILE_OUT_NAME << "\""
                  << std::endl;
        exit(EXIT_FAILURE);
    }
 
    file_out << remained_letters_str;  
}
2
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 19:02 1017
Mr.X, Как говорится в точку. Ваш код прошел все тесты.
2
Эксперт С++
476 / 444 / 34
Регистрация: 20.11.2009
Сообщений: 1,293
10.01.2011, 19:13 1018

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
28
29
30
#include <fstream>
#include <string>
 
using namespace std;
 
ifstream cin("input.txt");
ofstream cout("output.txt");
 
int main()
{
    int a[26] = {0}, n, m;
    cin >> n >> m;
    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
        {
            char ch;
            cin >> ch;
            a[ch-'A']++;
        }
    for(int i = 0; i < m; i++)
    {
        string s;
        cin >> s;
        for(int j = 0; j < s.size(); j++)
            a[s[j]-'A']--;
    }
    for(int i = 0; i < 26; i++)
        for(int j = 0; j < a[i]; j++)
            cout << char(i+'A');
}
1
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
10.01.2011, 22:15 1019
Хохол, И Вы в точку (кстати я решал так же как и Вы). Ваш код тоже прошел все тесты.

Добавлено через 11 минут
Раз задача решена, осталось провести только ее разбор:
Во-первых сразу сообщаю, что эту задачу не сам придумал, она действительно олимпиадная. Если кто не верит могу дать ссылку на нее.
Я бы сказал, что эта задача в первую очередь на внимательность. Ключевая фраза в условии:
Гарантируется, что в таблице можно найти и вычеркнуть по описанным выше правилам все ключевые слова.
А это значит, что не нужно делать то, что делал Петя:
Когда Петя находит слово, он вычеркивает его из таблицы.
Например если буква 'A' встречается в таблице 6 раз. А в ключевых словах буква 'A' встречается 5 раз, то нужно будет в выходной файл вывести букву 'A' один раз.

Добавлено через 2 часа 43 минуты
Ну и еще одна задачка:
Бутылки
(Время: 1 сек. Память: 16 Мб Сложность: 48%)

Группа программистов собралась в понедельник и на все свои деньги купила «Sprite» в бутылках емкостью по 0.25 л., не забыв взять сдачу.

Во вторник они сдали пустую посуду, добавили оставшуюся сдачу и вновь купили столько таких же бутылок «Sprite», сколько могли.

Так они действовали до пятницы. В пятницу, сдав посуду и добавив сдачу с четверга, они смогли купить только одну бутылку напитка. При этом денег у них уже не осталось.

Требуется написать программу, определяющую минимальную сумму, которой располагали программисты в понедельник.
Входные данные

Входной файл INPUT.TXT состоит из единственной строки, содержащей два целых числа F (стоимость одной бутылки «Sprite») и P (стоимость одной пустой бутылки из под «Sprite»), разделенных пробелом.

Ограничения: 1 ≤ P < F ≤ 10^9, начальная сумма не превосходит 2*10^9.
Выходные данные

В единственную строку выходного файла OUTPUT.TXT нужно вывести одно целое число – минимальную сумму, которой располагали программисты в понедельник.
Пример:
INPUT.TXT
7 3
OUTPUT.TXT
83
1
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
11.01.2011, 05:23 1020
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
//////////////////////////////////////////////////////////////////////////////////////
//БУТЫЛКИ
//(Время: 1 сек. Память: 16 Мб Сложность: 48%)
//Группа программистов собралась в понедельник и на все свои деньги купила «Sprite» 
//в бутылках емкостью по 0.25 л., не забыв взять сдачу. 
//Во вторник они сдали пустую посуду, добавили оставшуюся сдачу и вновь купили столько 
//таких же бутылок «Sprite», сколько могли. 
//Так они действовали до пятницы. В пятницу, сдав посуду и добавив сдачу с четверга, 
//они смогли купить только одну бутылку напитка. При этом денег у них уже не осталось. 
//Требуется написать программу, определяющую минимальную сумму, которой располагали 
//программисты в понедельник.
//------------------------------------------------------------------------------------
//ВХОДНЫЕ ДАННЫЕ
//Входной файл INPUT.TXT состоит из единственной строки, содержащей два целых числа F 
//(стоимость одной бутылки «Sprite») и P (стоимость одной пустой бутылки из под «Sprite»), 
//разделенных пробелом. 
//
//Ограничения: 1 ≤ P < F ≤ 10^9, начальная сумма не превосходит 2*10^9. 
//------------------------------------------------------------------------------------
//ВЫХОДНЫЕ ДАННЫЕ
//В единственную строку выходного файла OUTPUT.TXT нужно вывести одно целое число 
//– минимальную сумму, которой располагали программисты в понедельник.
//Пример:
//INPUT.TXT
//7 3
//OUTPUT.TXT
//83
//////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
//////////////////////////////////////////////////////////////////////////////////////
typedef long long  T_int;
//////////////////////////////////////////////////////////////////////////////////////
T_int  get_prev_sum(T_int  sum, T_int F, T_int P)
{
    return  ((sum - F) / P + 1) * (F - P) + sum;        
}
//////////////////////////////////////////////////////////////////////////////////////
int main()
{
    std::locale::global(std::locale(""));
    const T_int F_MAX = 1000000000;
    const T_int F_MIN = 2;
    const T_int P_MIN = 1;
 
    T_int F = 0;
    do
    {
        std::cout << "Стоимость полной бутылки F ("
                  << F_MIN 
                  << " <= F <= "
                  << F_MAX
                  << "): ";
        
        std::cin >> F;
    
    }while(   F < F_MIN
           || F_MAX < F);
 
    std::cout << std::endl;
 
    T_int P = 0;
    do
    {
        std::cout << "Стоимость пустой бутылки P ("
                  << P_MIN 
                  << " <= P < "
                  << F
                  << ")          : ";
        
        std::cin >> P;
    
    }while(   P < P_MIN
           || F <= P);
 
    T_int min_start_sum = F;
    for(T_int  i = 0; i < 4; ++i)
    {
        min_start_sum = get_prev_sum(min_start_sum, F, P);
    }
 
    std::cout << "Минимальная начальная сумма                      : "
              << min_start_sum
              << std::endl;
}
4
11.01.2011, 05:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.01.2011, 05:23
Помогаю со студенческими работами здесь

Проверить на правильность и закомментировать весь код для лучшего понимания
Всем здравствуйте. Условие задачи - Заданная матрица целых чисел размером (N, N). Найти среднее...

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

Нужны задачи для тренировки
Здравствуйте киньте пожалуйста задания по с++ для человека начинающего изучать Turbo с++

Нужны задачи для тренировки
Вот не давно был школьный этап по программирование в школе(олимпиады). Меня закинули на городскую,...


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

Или воспользуйтесь поиском по форуму:
1020
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru