Ranking (as of 2015-04-08): 43 out of 153
Language: C++
/*
UVa 857 - Quantiser
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_857_Quantiser.cpp
*/
#include <set>
#include <algorithm>
#include <cstdio>
using namespace std;
const int n_max = 2000;
struct timestamp {
int i_, note_, m_, b_, t_;
timestamp() {}
timestamp(int i, int note, int m, int b, int t)
: i_(i), note_(note), m_(m), b_(b), t_(t) {}
bool operator<(const timestamp& t) const {
if (m_ != t.m_)
return m_ < t.m_;
else if (b_ != t.b_)
return b_ < t.b_;
else if (t_ != t.t_)
return t_ < t.t_;
else
return note_ < t.note_;
}
};
struct message {
int code_, note_, m_, b_, t_;
bool filtered_;
bool operator<(const message& m) const {
if (m_ != m.m_)
return m_ < m.m_;
else if (b_ != m.b_)
return b_ < m.b_;
else
return t_ < m.t_;
}
} messages[n_max];
int main()
{
while (true) {
int n;
scanf("%d", &n);
if (n == -1) {
printf("%d\n", n);
break;
}
int nr_messages = 0;
multiset<timestamp> timestamps;
for (int i = 0; i < n; i++) {
message& m = messages[nr_messages];
m.filtered_ = false;
scanf("%d %d %d %d %d", &m.code_, &m.note_, &m.m_, &m.b_, &m.t_);
int j = m.t_ / 60, k = m.t_ % 60;
if (k >= 30)
j++;
if ((m.t_ = 60 * j) == 480) {
m.t_ = 0;
if ((m.b_ += 1) == 5) {
m.b_ = 1;
m.m_++;
}
}
#ifdef DEBUG
printf(" %d %d %d %d %d\n", m.code_, m.note_, m.m_, m.b_, m.t_);
#endif
timestamp ts(nr_messages, m.note_, m.m_, m.b_, m.t_);
if (m.code_) {
timestamps.insert(ts);
nr_messages++;
}
else {
pair<multiset<timestamp>::iterator, multiset<timestamp>::iterator>
result = timestamps.equal_range(ts);
if (result.first == result.second)
nr_messages++;
else {
for (multiset<timestamp>::iterator ti = result.first;
ti != result.second; ++ti)
messages[ti->i_].filtered_ = true;
}
}
}
stable_sort(messages, messages + nr_messages);
int nr_filtered = 0;
for (int i = 0; i < nr_messages; i++)
if (messages[i].filtered_)
nr_filtered++;
printf("%d\n", nr_messages - nr_filtered);
for (int i = 0; i < nr_messages; i++) {
const message& m = messages[i];
if (!m.filtered_)
printf("%d %d %d %d %d\n", m.code_, m.note_, m.m_, m.b_, m.t_);
}
}
return 0;
}
No comments:
Post a Comment