#include #include #include #include #include #include #include using namespace std; ifstream input_stream; ofstream output_stream; struct Order { int id; int price; int deadline; bool operator < (const Order &order) const { return price < order.price; } }; struct compareOrderPointers { bool operator() (const Order *lhs, const Order *rhs) const { return lhs->price > rhs->price; } }; int main() { int orders_count; input_stream.open("moda.in"); input_stream >> orders_count; vector orders; orders.reserve(orders_count); int total_price; unordered_map> orders_by_deadline; vector schedule; schedule.reserve(24); for (int i = 0; i < 24; i++) { schedule.push_back(0); } int max_deadline = 0; for (int i = 0; i < orders_count; i++) { Order order; input_stream >> order.deadline >> order.price; order.id = i + 1; orders.push_back(order); max_deadline = max(max_deadline, order.deadline); orders_by_deadline[order.deadline].insert(&orders.back()); total_price += order.price; } multiset current_orders; int revenue = 0; for (int hour = max_deadline; hour>=1; hour--) { if (orders_by_deadline.find(hour) != orders_by_deadline.end()) { for (Order *order : orders_by_deadline[hour]) { current_orders.insert(order); } } if (!current_orders.empty()) { schedule[hour - 1] = (*current_orders.begin())->id; revenue += (*current_orders.begin())->price; current_orders.erase(current_orders.begin()); } } cout << revenue << " " << total_price - revenue << "\n"; for (int i = 0; i < 24; i++) { if (schedule[i] != 0) { cout << schedule[i] << " "; } } cout << "\n"; return 0; }