


Олимпиада по информатике
Пятикласснице Маше задают на дом очень много уроков. Сегодня ей нужно сделать домашнее задание по шести предметам:
Математика (М)
Информатика (И)
Литература (Л)
Русский язык (Р)
География (Г)
Биология (Б)
Но у Маши есть несколько требований, касающихся порядка выполнения домашних заданий. Так, про некоторые пары предметов известно, что один из них Маша хочет учить раньше другого:
Биологию раньше, чем Литературу
Русский язык раньше, чем Географию
Математику раньше, чем Литературу
Биологию раньше, чем Географию
Литературу раньше, чем Информатику
Математику раньше, чем Биологию
Географию раньше, чем Информатику
Математику раньше, чем Русский язык
Помогите Маше составить план выполнения домашних заданий, удовлетворяющий всем её требованиям. Учтите, что можно составить несколько планов. Напишите их все.
В ответе нужно записать несколько строк. Каждая строка должна содержать один план выполнения домашних заданий в виде последовательности из первых букв названий предметов: М, И, Л, Р, Г, Б. Учтите, что Маше необходимо сделать домашнее задание по всем шести предметам.
Например, вы можете предложить Маше такой план:
МИЛРГБ
Только этот план НЕПРАВИЛЬНЫЙ, потому что в нем География учится позже Информатики, а по требованиям Маши должно быть наоборот. Есть и другие ошибки в этом плане.
Необходимо, чтобы каждый составленный вами план удовлетворял ВСЕМ требованиям.
Чем больше различных правильных планов вы составите, тем больше баллов получите. Но за составленные планы, не удовлетворяющие требованиям Маши, баллы будут сниматься.
#include <algorithm>
#include <iostream>
using namespace std;
bool plane(const string& s) {
if (find(s.begin(), s.end(), 'М') > find(s.begin(), s.end(), 'Л')) return false;
if (find(s.begin(), s.end(), 'М') > find(s.begin(), s.end(), 'Б')) return false;
if (find(s.begin(), s.end(), 'М') > find(s.begin(), s.end(), 'Р')) return false;
if (find(s.begin(), s.end(), 'Б') > find(s.begin(), s.end(), 'Л')) return false;
if (find(s.begin(), s.end(), 'Б') > find(s.begin(), s.end(), 'Г')) return false;
if (find(s.begin(), s.end(), 'Р') > find(s.begin(), s.end(), 'Г')) return false;
if (find(s.begin(), s.end(), 'Л') > find(s.begin(), s.end(), 'И')) return false;
if (find(s.begin(), s.end(), 'Г') > find(s.begin(), s.end(), 'И')) return false;
return true;
}
int main() {
system("chcp 1251 > nul");
string temp{ "МИЛРГБ" };
sort(temp.begin(), temp.end());
do {
if (plane(temp)) cout << temp << '\n';
} while (next_permutation(temp.begin(), temp.end()));
system("pause > nul");
}
Просто отсортируй все предметы, составь ряд на бумажке, составь порядок очередности (какой-нибудь граф) предметов и на основе этого составляй планы