Files
contests/2020/sector/moda_revisited.cpp
2024-04-22 16:22:10 +03:00

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;
}