Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <iostream>
- #include <functional>
- #include <map>
- #include <unordered_map>
- #include <numeric>
- #include <set>
- #include <string>
- #include <vector>
- using namespace std;
- struct Person {
- string name;
- int age, income;
- bool is_male;
- };
- struct PreCalculatedInfo
- {
- std::vector<int> age_set;
- std::vector<int> wealth_set;
- std::vector<int> wealth_precalculated;
- std::vector<int> age_precalculated;
- std::unordered_map<std::string_view, int> women_names;
- std::unordered_map<std::string_view, int> men_names;
- std::string popular_man_name;
- std::string popular_woman_name;
- };
- const PreCalculatedInfo Precalculate(std::vector<Person> people)
- {
- PreCalculatedInfo result;
- int popular_woman_name_counter = 0;
- int popular_man_name_counter = 0;
- //запоминаем самых популярных людей мужского и женского пола
- for(const auto& it : people)
- {
- result.wealth_set.push_back(it.income);
- result.age_set.push_back(it.age);
- // (it.is_male) ? result.men_names[it.name]++ : result.women_names[it.name]++;
- if(it.is_male)
- {
- result.men_names[it.name]++;
- if(result.men_names[it.name] > popular_man_name_counter)
- {
- popular_man_name_counter++;
- result.popular_man_name = it.name;
- }
- }
- else
- {
- result.women_names[it.name]++;
- if(result.women_names[it.name] > popular_woman_name_counter)
- {
- popular_woman_name_counter++;
- result.popular_woman_name = it.name;
- }
- }
- }
- //упорядочиваем векторы по возрастанию для age и убыванию для wealth
- std::sort(result.age_set.begin(), result.age_set.end());
- std::sort(result.wealth_set.begin(), result.wealth_set.end(), [](const int& lhs, const int& rhs){return lhs >= rhs;});
- //вычисляем значения богатства для запроса WEALTH
- result.wealth_precalculated.reserve(result.wealth_set.size()+1);
- result.wealth_precalculated[0] = 0;
- size_t counter = 1;
- for(const auto& it : result.wealth_set)
- {
- result.wealth_precalculated[counter] = result.wealth_precalculated[counter-1] + it;
- counter++;
- }
- //вычисляем значения совершеннолетних для запроса AGE
- size_t max_age = result.age_set[result.age_set.size()-1];
- result.age_precalculated.reserve(max_age+1);
- for(size_t i = 0; i <= max_age; i++ )
- {
- auto adult_begin = lower_bound(result.age_set.begin(), result.age_set.end(), i);
- result.age_precalculated[i] = distance(adult_begin, result.age_set.end());
- }
- return result;
- }
- const vector<Person> ReadPeople(istream& input) {
- int count;
- input >> count;
- vector<Person> result(count);
- for (Person& p : result) {
- char gender;
- input >> p.name >> p.age >> p.income >> gender;
- p.is_male = gender == 'M';
- }
- return result;
- }
- int main()
- {
- //вызов через функцию
- //const PreCalculatedInfo pre_calc_info = Precalculate(ReadPeople(cin));
- const vector<Person> people = ReadPeople(cin);
- //вызов через лямбду
- const PreCalculatedInfo pre_calc_info = std::invoke([&people]{
- PreCalculatedInfo result;
- int popular_woman_name_counter = 0;
- int popular_man_name_counter = 0;
- //запоминаем самых популярных людей мужского и женского пола
- for(const auto& it : people)
- {
- result.wealth_set.push_back(it.income);
- result.age_set.push_back(it.age);
- // (it.is_male) ? result.men_names[it.name]++ : result.women_names[it.name]++;
- if(it.is_male)
- {
- result.men_names[it.name]++;
- if(result.men_names[it.name] > popular_man_name_counter)
- {
- popular_man_name_counter++;
- result.popular_man_name = it.name;
- }
- }
- else
- {
- result.women_names[it.name]++;
- if(result.women_names[it.name] > popular_woman_name_counter)
- {
- popular_woman_name_counter++;
- result.popular_woman_name = it.name;
- }
- }
- }
- //упорядочиваем векторы по возрастанию для age и убыванию для wealth
- std::sort(result.age_set.begin(), result.age_set.end());
- std::sort(result.wealth_set.begin(), result.wealth_set.end(), [](const int& lhs, const int& rhs){return lhs >= rhs;});
- //вычисляем значения богатства для запроса WEALTH
- result.wealth_precalculated.reserve(result.wealth_set.size()+1);
- result.wealth_precalculated[0] = 0;
- size_t counter = 1;
- for(const auto& it : result.wealth_set)
- {
- result.wealth_precalculated[counter] = result.wealth_precalculated[counter-1] + it;
- counter++;
- }
- //вычисляем значения совершеннолетних для запроса AGE
- size_t max_age = result.age_set[result.age_set.size()-1];
- result.age_precalculated.reserve(max_age+1);
- for(size_t i = 0; i <= max_age; i++ )
- {
- auto adult_begin = lower_bound(result.age_set.begin(), result.age_set.end(), i);
- result.age_precalculated[i] = distance(adult_begin, result.age_set.end());
- }
- return result;
- });
- for (string command; cin >> command;)
- {
- if (command == "AGE"s)
- {
- int adult_age;
- cin >> adult_age;
- //auto adult_begin = lower_bound(pre_calc_info.age_set.begin(), pre_calc_info.age_set.end(), adult_age);
- cout << "There are "s << pre_calc_info.age_precalculated[adult_age] << " adult people for maturity age "s
- << adult_age << '\n';
- }
- else if (command == "WEALTHY"s)
- {
- int count;
- cin >> count;
- cout << "Top-"s << count << " people have total income "s << pre_calc_info.wealth_precalculated[count] << '\n';
- }
- else if (command == "POPULAR_NAME"s)
- {
- char gender;
- cin >> gender;
- if(gender == 'M' && pre_calc_info.men_names.size() == 0)
- {
- cout << "No people of gender "s << gender << '\n';
- }
- else if (gender == 'M' && pre_calc_info.men_names.size() > 0)
- {
- cout << "Most popular name among people of gender "s << gender << " is "s << pre_calc_info.popular_man_name << '\n';
- }
- else if(gender == 'W' && pre_calc_info.women_names.size() == 0)
- {
- cout << "No people of gender "s << gender << '\n';
- }
- else if(gender == 'W' && pre_calc_info.women_names.size() > 0)
- {
- cout << "Most popular name among people of gender "s << gender << " is "s << pre_calc_info.popular_woman_name << '\n';
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement