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

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 2744, средняя оценка - 4.89
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
#1

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

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

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

Список задач, решение которых присутствует в данной теме:
Лучшие ответы (59)
Сообщение: #857841 Сообщение: #857861 Сообщение: #858352 Сообщение: #859371 Сообщение: #860160 Сообщение: #860255 Сообщение: #860259 Сообщение: #860317 Сообщение: #860368 Сообщение: #860466 Сообщение: #860508 Сообщение: #860720 Сообщение: #861091 Сообщение: #862174 Сообщение: #862617 Сообщение: #867259 Сообщение: #870298 Сообщение: #872053 Сообщение: #876456 Сообщение: #880114 Сообщение: #882889 Сообщение: #884418 Сообщение: #886414 Сообщение: #886989 Сообщение: #887733 Сообщение: #888464 Сообщение: #888487 Сообщение: #888941 Сообщение: #888947 Сообщение: #889040 Сообщение: #889450 Сообщение: #889587 Сообщение: #891772 Сообщение: #891790 Сообщение: #891862 Сообщение: #897758 Сообщение: #897782 Сообщение: #906325 Сообщение: #907991 Сообщение: #943672 Сообщение: #943700 Сообщение: #967735 Сообщение: #1053777 Сообщение: #1054209 Сообщение: #1083853 Сообщение: #1083928 Сообщение: #1131058 Сообщение: #1131359 Сообщение: #1273743 Сообщение: #1275465 Сообщение: #1276743 Сообщение: #1279215 Сообщение: #1282583 Сообщение: #1309088 Сообщение: #1315633 Сообщение: #1366395 Сообщение: #1550164 Сообщение: #1603678 Сообщение: #1604364
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.07.2010, 05:53     Задачи для тренировки и лучшего понимания
Посмотрите здесь:

C++ Какой компилятор выбрать для лучшего изучения С++ по книге Берна Страуструпа?п
C++ Элементарные программы, для лучшего понимания языка...
Нужны задачи для тренировки C++
C++ Киньте задачки для тренировки
C++ Нужны простые задачи для тренировки
Нужны задачи для тренировки C++
На соревнованиях по фигурному катанию оценки заносятся в компьютер. Составить программу для вывода на экран лучшего результата после каждого выступлен C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,025
Завершенные тесты: 1
09.01.2011, 17:45     Задачи для тренировки и лучшего понимания #1001
valeriikozlov, ааа, всё, теперь понял. Надо постоянно отслеживать, можно ли ещё добраться до угла, двигаясь только вниз и влево, и если нет, откатываться назад (при одном варианте решение, возможно, есть алгоритм без отката).

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

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

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

Добавлено через 3 минуты
Во, я не понимаю, что есть "правильная игра"? Я знаю такой тип задачек, где оговорены условия, но чего-то делать нельзя, и определить надо, кто при правильной игре выиграет. Здесь вроде всё то же самое, только вот не пойму я, чего делать-то нельзя?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
09.01.2011, 18:08     Задачи для тренировки и лучшего понимания #1002
Цитата Сообщение от silent_1991 Посмотреть сообщение
Во, я не понимаю, что есть "правильная игра"?
Правильная игра, это когда каждый игрок своим ходом старается выиграть (и выигрывает, если ситуация не проигрышная). Ход мыслей у Вас в правильном направлении.... Еще чуть-чуть и додумаетесь.
По своему опыту: лучше взять листок в клетку и начиная с клетки (1, 1) подумать кто выигрывает с какой клетки (для достижения истины не так уж много клеток нужно рассмотреть).
silent_1991
Эксперт С++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,025
Завершенные тесты: 1
09.01.2011, 18:24     Задачи для тренировки и лучшего понимания #1003
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Правильная игра, это когда каждый игрок своим ходом старается выиграть
Но не помешать выиграть другому? У него такой задачи нет?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
09.01.2011, 18:55     Задачи для тренировки и лучшего понимания #1004
Цитата Сообщение от silent_1991 Посмотреть сообщение
Но не помешать выиграть другому? У него такой задачи нет?
Ну по-моему это одно и тоже. Один игрок делая ход и ставя этим ходом другого игрока в пригрышную позицию, тем самым обеспечивает себе победу (т.е. такой ход и называется правильным ходом).
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
10.01.2011, 02:22  [ТС]     Задачи для тренировки и лучшего понимания #1005
Функция Шпрага-Гранди
Разве не та же тема?
Mr.X
Эксперт С++
 Аватар для Mr.X
3021 / 1677 / 265
Регистрация: 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;
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
10.01.2011, 07:58     Задачи для тренировки и лучшего понимания #1007
Mr.X, Ваш код прошел все тесты.
ForEveR, Та же самая получается тема.
Теперь у меня вопрос: раз есть правильное решение, разбор этой задачи нужно делать?
silent_1991
Эксперт С++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,025
Завершенные тесты: 1
10.01.2011, 07:59     Задачи для тренировки и лучшего понимания #1008
valeriikozlov, можно, вряд ли вы предполагали такое решение))) (честно говоря, мне лень было думать))) Если бы подумал - решил бы, а так - посмотрю ваш вариант)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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) не такие уж и большие. Все заполнение матрицы пройдет быстро.
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
17192 / 5446 / 337
Регистрация: 30.03.2009
Сообщений: 14,777
Записей в блоге: 26
10.01.2011, 10:38     Задачи для тренировки и лучшего понимания #1010
valeriikozlov, именно это я и имел в виду, что задача математическая (аналитическая), ибо решается на бумажке. Т.е. будь ты хоть 100 раз программист, но если ты на бумажке её не решил, то программу не напишешь. Наверное я неправильным термином пользуюсь, но под "математической" задачей подразумеваю именно такие
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
10.01.2011, 12:57     Задачи для тренировки и лучшего понимания #1011
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. будь ты хоть 100 раз программист, но если ты на бумажке её не решил, то программу не напишешь.
с этим согласен полностью. Сначало должен родится алгоритм решения такой задачи. А потом его реализация кодом.
Насчет терминов:
Цитата Сообщение от Evg Посмотреть сообщение
Наверное я неправильным термином пользуюсь
может быть и правильный термин. По моему мнению аналитика и математика очень сильно связаны.
silent_1991
Эксперт С++
4949 / 3025 / 149
Регистрация: 11.11.2009
Сообщений: 7,025
Завершенные тесты: 1
10.01.2011, 13:18     Задачи для тренировки и лучшего понимания #1012
Цитата Сообщение от valeriikozlov Посмотреть сообщение
аналитика и математика очень сильно связаны
Так и есть, в частности, аналитическое решение - решение, полученное с использованием логических заключений и математических выкладок, т.е. решение, которое, по сути, описывается формулой (или группой формул), и, что самое важное, даёт точный ответ (в отличие от численного решения, в котором главное не формула, а итерации, и отвёт даётся только с некоторой точностью).
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
10.01.2011, 16:36     Задачи для тренировки и лучшего понимания #1014
Задача слишком легкая
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
10.01.2011, 16:37     Задачи для тренировки и лучшего понимания #1015
Хохол, точно.
Mr.X
Эксперт С++
 Аватар для Mr.X
3021 / 1677 / 265
Регистрация: 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;  
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
10.01.2011, 19:02     Задачи для тренировки и лучшего понимания #1017
Mr.X, Как говорится в точку. Ваш код прошел все тесты.
Хохол
Эксперт C++
 Аватар для Хохол
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
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');
}
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2011, 05:23     Задачи для тренировки и лучшего понимания
Еще ссылки по теме:

C++ Какая база требуется для понимания C++?
C++ Нужен пример рекурсивной функции для понимания ее назначения и практической пользы
C++ Builder Прошу примеров для понимания INDY
Книги для тренировки/развития котелка и просто убийства времени C++
Дайте задания для тренировки C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
3021 / 1677 / 265
Регистрация: 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;
}
Yandex
Объявления
11.01.2011, 05:23     Задачи для тренировки и лучшего понимания
Закрытая тема Создать тему
Опции темы

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