2017-2018
This commit is contained in:
95
2020/sector/moda_revisited.cpp
Normal file
95
2020/sector/moda_revisited.cpp
Normal file
@@ -0,0 +1,95 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user