Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <utility>
- #include <algorithm>
- void Read(std::vector<std::pair<int, int>>* rates) {
- size_t size;
- std::cin >> size;
- rates->reserve(size);
- for (size_t it = 0; it < size; ++it) {
- int curr_rate;
- std::cin >> curr_rate;
- rates->emplace_back(curr_rate, it + 1);
- }
- std::sort(rates->begin(), rates->end());
- std::reverse(rates->begin(), rates->end());
- }
- int64_t GetBestTeam(const std::vector<std::pair<int, int>>& rates, std::vector<int>* result) {
- size_t left = 0;
- int64_t sum = static_cast<int64_t>(rates[0].first) + static_cast<int64_t>(rates[1].first);
- int64_t max_sum = sum;
- size_t max_left = 0;
- size_t max_right = 1;
- for (size_t right = 2; right < rates.size(); ++right) {
- while (right >= left + 2 &&
- static_cast<int64_t>(rates[right].first) + static_cast<int64_t>(rates[right - 1].first)
- < rates[left].first) {
- sum -=rates[left].first;
- ++left;
- }
- sum += rates[right].first;
- if (sum > max_sum) {
- max_sum = sum;
- max_left = left;
- max_right = right;
- }
- }
- result->reserve(max_right - max_left + 1);
- for (size_t it = max_left; it <= max_right; ++it) {
- result->push_back(rates[it].second);
- }
- std::sort(result->begin(), result->end());
- return max_sum;
- }
- int main() {
- std::vector<std::pair<int, int>> rates;
- std::vector<int> result;
- Read(&rates);
- if (rates.size() == 1) {
- std::cout << rates[0].first << '\n';
- std::cout << 1;
- return 0;
- }
- auto max_rate = GetBestTeam(rates, &result);
- std::cout << max_rate << '\n';
- for (auto elem : result) {
- std::cout << elem << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement