Cod sursa(job #586258)

Utilizator freak93Adrian Budau freak93 Data 30 aprilie 2011 14:18:24
Problema Fabrica Scor 0
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Clasele 10-12 Marime 1.68 kb
#include <set>
#include <cstdio>

using namespace std;

const char iname[] = "fabrica.in";
const char oname[] = "fabrica.out";
const int maxn = 100005;
const int buffer = 2048;

unsigned int a[maxn], b[maxn], ta[maxn], timp[maxn];

char s[buffer];
int p = buffer - 1;

void cit(unsigned int &x) {
	x = 0;
	while (s[p] < '0' && s[p] > '9')
		if (++p == buffer)
			fread(s, 1, buffer, stdin);
	while (s[p] >= '0' && s[p] <= '9') {
		x = x * 10 + s[p] - '0';
		if (++p == buffer)
			fread(s, 1, buffer, stdin);
	}
}

int main() {
	freopen(iname, "r", stdin);
	freopen(oname, "w", stdout);
	unsigned int N, M, K;
	cit(N); cit(M); cit(K);

	for (int i = 1; i <= M; ++i)
		cit(a[i]), ta[i] = 0;

	for (int i = 1; i <= K; ++i)
		cit(b[i]);
    //Terminam cu turnarea
	set< pair<unsigned, int> > S;
	for (int i = 1; i <= M; ++i)
		S.insert(make_pair(a[i], i));
	
	for (int i = 1; i <= N; ++i) {
		int v = S.begin() -> second;
		timp[i] = S.begin() -> first;
		//fprintf(stderr, "%d %d -> ", S.begin() -> first, S.begin() -> second);
		S.erase(S.begin());
		ta[v] += a[v];
		S.insert(make_pair(ta[v] + a[v], v));
		//fprintf(stderr, "%d\n", timp[i]);
	}

	printf("%d ",timp[N]);
	unsigned int step = (1u << 31);
	unsigned int i;
	for (i = 0; step; step >>= 1) {
		i += step;
		S.clear();
		for (int j = 1; j <= K; ++j)
			S.insert(make_pair(i - b[j], j));
		int j;
		for (j = N; j > 0; --j) {
			if (S.size() == 0)
				break;
			unsigned int x = S.rbegin() -> first;
			if (x < timp[j])
				break;
			int y = S.rbegin() -> second;
			S.erase(*S.rbegin());
			if (x < b[y])
				continue;
			x -= b[y];
			S.insert(make_pair(x, y));
		}
		//fprintf(stderr, "%u -> %d\n", i, j);
		if (j == 0)
			i -= step;
	}
	printf("%d\n", i + 1);
}