Множественный набор для определенного пользователем типа данных
Опубликовано: 30 Декабря, 2021
Вам задают Q запросов. Каждый запрос содержит целое число k и информацию о человеке, т. Е. Имя, фамилию, возраст. Для каждого запроса нам нужно вывести K-го человека среди них, если вся информация о человеке расположена в порядке возрастания.
Примечание: человек A стоит перед лицом B, если имя A лексикографически меньше, чем имя B. Но если имя такое же, мы сравниваем фамилию, а также, если фамилия такая же, то мы должны сравнить их возраст .
Дано: K всегда будет меньше или равно количеству присутствующих людей.
Примеры:
Ввод: Q = 2 1 аа бб 10 2 Би-би-си 10 Выход : Имя: aa Фамилия: bb Возраст: 10 лет Имя: bb Фамилия: cc Возраст: 10 лет
Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.
Подход: Для решения указанной выше проблемы используется приведенный ниже алгоритм.
- В основном нам дается подробное описание человека с каждым запросом, и мы должны сообщить K-му человеку, если они расположены в порядке возрастания.
- Базовый подход: после каждого запроса мы сортируем наш список и просто выводим информацию о k-м человеке. Но если мы решим указанную выше проблему с помощью сортировки, то временная сложность будет O (q * q * log (q)). т.е. O (qlog (q)) для сортировки каждый раз и q запросов.
- Оптимизировано: мы можем улучшить временную сложность для указанной выше проблемы. Как мы знаем, вставка в мультимножество может выполняться в log (n).
- Итак, просто создайте мультимножество, которое можно использовать для хранения структуры, а затем после каждого запроса просто вставьте детали человека в наш мультимножество.
- Итак, это кажется лучшим подходом. Наша общая сложность будет O (q * log (q)).
// CPP program for queries to find k-th person where // people are considered in lexicographic order of // first name, then last name, then age #include <bits/stdc++.h> using namespace std; struct person { string firstName, lastName; int age; }; // operator overloading to use multiset for user // define data type. bool operator<(person a, person b) { if (a.firstName < b.firstName) return true ; else if (a.firstName == b.firstName) { if (a.lastName < b.lastName) return true ; else if (a.lastName == b.lastName) { if (a.age < b.age) return true ; else return false ; } else return false ; } else return false ; } // define function for printing our output void print(multiset<person>::iterator it) { cout << "First name:" << it->firstName << endl; cout << "Last name:" << it->lastName << endl; cout << "Age: " << it->age << endl; } int main() { int q = 2; // define set for structure multiset<person> s; // declaration of person structure person p; // 1st Query k=1, first-name=aa, last-name=bb, age=10; int k = 1; p.firstName = "aa" ; p.lastName = "bb" ; p.age = 10; // now insert this structure in our set. s.insert(p); // now find Kth smallest element in set. multiset<person>::iterator it; it = s.begin(); // find kth element by increment iterator by k std::advance(it, k - 1); print(it); // 2nd Query k=2, first-name=bb, last-name=cc, age=10; k = 2; p.firstName = "bb" ; p.lastName = "cc" ; p.age = 10; // now insert this structure in our set. s.insert(p); // now find Kth smallest element in set. it = s.begin(); // find kth element by increment iterator by k std::advance(it, k - 1); print(it); return 0; } |
Выход:
Имя: aa Фамилия: bb Возраст: 10 лет Имя: bb Фамилия: cc Возраст: 10 лет
Хотите учиться на лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для языка и STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .