Pagini recente » Cod sursa (job #3164660) | Cod sursa (job #374826) | Cod sursa (job #254091) | Cod sursa (job #2930863) | Cod sursa (job #586295)
Cod sursa(job #586295)
#include <set>
#include <cstdio>
#include <cstring>
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), p = 0;
}
while (s[p] >= '0' && s[p] <= '9') {
x = x * 10 + s[p] - '0';
if (++p == buffer)
fread(s, 1, buffer, stdin), p = 0;
}
}
int main() {
freopen(iname, "r", stdin);
freopen(oname, "w", stdout);
unsigned int N, M, K;
memset(s, 0, sizeof(s));
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);
}