Ranking (as of 2015-05-29): 54 out of 87
Language: C++
/*
UVa 1064 - Network
To build using Visual Studio 2012:
cl -EHsc -O2 UVa_1064_Network.cpp
*/
#include <set>
#include <algorithm>
#include <limits>
#include <cstdio>
using namespace std;
const int nr_messages_max = 5, nr_packets_max = 1000;
struct packet {
int mn_, sn_, en_;
} packets[nr_packets_max];
struct packet_comparator {
bool operator()(int i, int j) {
return packets[i].sn_ < packets[j].sn_;
}
};
struct message {
int nr_data_, out_n_; // next byte numbet to be output
set<int, packet_comparator> packets_;
} messages[nr_messages_max];
int remove_packet_buffers(message& m, int& out_n)
{
int nr_data = 0;
set<int, packet_comparator>::iterator pi = m.packets_.begin(),
pe = m.packets_.end();
for ( ; pi != pe; ++pi) {
if (out_n < packets[*pi].sn_)
break;
nr_data += packets[*pi].en_ - packets[*pi].sn_ + 1;
out_n = packets[*pi].en_ + 1;
}
if (nr_data)
m.packets_.erase(m.packets_.begin(), pi);
return nr_data;
}
int main()
{
for (int case_nr = 1; ; case_nr++) {
int N, M;
scanf("%d %d", &N, &M);
if (!N)
break;
for (int i = 0; i < N; i++)
scanf("%d", &messages[i].nr_data_);
for (int i = 0; i < M; i++) {
scanf("%d %d %d", &packets[i].mn_, &packets[i].sn_, &packets[i].en_);
packets[i].mn_--;
}
int order[nr_messages_max]; // order in which messages will be out
for (int i = 0; i < N; i++)
order[i] = i;
int buff_max = numeric_limits<int>::max();
do {
#ifdef DEBUG
for (int i = 0; i < N; i++)
printf("%d%c", order[i], ((i < N - 1) ? ' ' : '\n'));
#endif
int b = 0, b_max = 0, nr_out = 0;
for (int i = 0; i < N; i++) {
messages[i].out_n_ = 1;
messages[i].packets_.clear();
}
for (int i = 0; i < M; i++) {
const packet& p = packets[i];
message& m = messages[p.mn_];
if (p.mn_ == order[nr_out] && m.out_n_ == p.sn_) {
m.out_n_ = p.en_ + 1;
int nr_data = remove_packet_buffers(m, m.out_n_);
if (nr_data)
b -= nr_data;
if (m.out_n_ == m.nr_data_ + 1) { // a message is complete
for (nr_out++; nr_out < N; nr_out++) {
message& mm = messages[order[nr_out]];
if (nr_data = remove_packet_buffers(mm, mm.out_n_))
b -= nr_data;
if (mm.out_n_ < mm.nr_data_ + 1)
break;
}
}
}
else {
m.packets_.insert(i);
b += p.en_ - p.sn_ + 1;
}
b_max = max(b_max, b);
#ifdef DEBUG
printf("%d %d %d, b: %d, b_max: %d\n", p.mn_, p.sn_, p.en_, b, b_max);
#endif
#ifndef DEBUG
if (buff_max != numeric_limits<int>::max() && b_max >= buff_max)
break;
#endif
}
buff_max = min(buff_max, b_max);
#ifdef DEBUG
printf("buff_max: %d, buff_max_min: %d\n", b_max, buff_max);
#endif
} while (next_permutation(order, order + N));
printf("Case %d: %d\n\n", case_nr, buff_max);
}
return 0;
}