Ranking (as of 2014-05-24): 38 out of 85
Language: C++
/*
UVa 10588 - Queuing at the doctors
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_10588_Queuing_at_the_doctors.cpp
*/
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int n_max = 1000, m_max = 1000;
struct member { // ICORE member
int t_; // arrival time
int k_; // number of doctor's offices to visit
int ki_; // next doctor's office to visit
vector<int> offices_; // doctor's offices to visit
} members[n_max];
struct visitor_comparator {
bool operator() (const int& i, const int& j) {
const member& mi = members[i]; const member& mj = members[j];
// in ascending order of arrival time or
// in ascending order of member's number
if (mi.t_ > mj.t_)
return true;
else if (mi.t_ < mj.t_)
return false;
else
return i > j;
}
};
priority_queue<int, vector<int>, visitor_comparator> arrivals, leaves;
priority_queue<int, vector<int>, visitor_comparator> offices[m_max];
// offices[i] is the queue at the i-th doctor's office,
// items of which are indices to members[i]
int main()
{
int c;
cin >> c;
while (c--) {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
member& m = members[i];
cin >> m.t_ >> m.k_;
m.ki_ = 0;
m.offices_.resize(m.k_);
for (int j = 0; j < m.k_; j++) {
cin >> m.offices_[j];
m.offices_[j]--;
}
arrivals.push(i);
}
int t = 0;
size_t remained = arrivals.size();
while (true) {
while (!arrivals.empty()) {
int i = arrivals.top();
member& m = members[i];
if (m.t_ < t)
break;
arrivals.pop();
if (m.ki_ < m.k_)
offices[m.offices_[m.ki_++]].push(i);
else
leaves.push(i);
}
for (int i = 0; i < m; i++) {
priority_queue<int, vector<int>, visitor_comparator>& office =
offices[i];
if (!office.empty()) {
int j = office.top();
member& m = members[j];
if (m.t_ <= t) {
office.pop();
m.t_ = t + 1;
if (m.ki_ < m.k_)
offices[m.offices_[m.ki_++]].push(j);
else
leaves.push(j);
}
}
}
while (!leaves.empty()) {
int i = leaves.top();
member& m = members[i];
if (m.t_ > t)
break;
leaves.pop();
remained--;
}
if (!remained)
break;
t++;
}
cout << t << endl;
}
return 0;
}
No comments:
Post a Comment