96 lines
2.0 KiB
C++
96 lines
2.0 KiB
C++
#include <iostream>
|
|
#include <fstream>
|
|
#include <algorithm>
|
|
#include <vector>
|
|
#include <unordered_map>
|
|
#include <set>
|
|
#include <unordered_set>
|
|
|
|
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<Order> orders;
|
|
orders.reserve(orders_count);
|
|
int total_price;
|
|
|
|
unordered_map<int, unordered_set<Order*>> orders_by_deadline;
|
|
|
|
vector<int> 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<Order*, compareOrderPointers> 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;
|
|
}
|