Cod sursa(job #585937)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 30 aprilie 2011 12:47:15
Problema Fabrica Scor 20
Compilator cpp Status done
Runda Algoritmiada 2011, Runda Finală, Open Marime 1.35 kb
#include<cstdio>
#include<vector>
#include<algorithm>
#define infile "fabrica.in"
#define outfile "fabrica.out"
#define nrMax 50013
#define inf (~(1<<31))
#define ll long long

using namespace std;

vector <int> a;
vector <int> b;
int n;
int ta, tb, tot;

vector <int> readVector(int n) {
  vector <int> v;
  for(int i = 1; i <= n; ++i) {
    int x;
    scanf("%d", &x);
    v.push_back(x);
  }
  return v;
}

void writeVector(vector <int> v) {
  for(unsigned i = 0; i < v.size(); ++i)
    printf("%d ", v[i]);
  printf("\n");
}

void read() {
  int nrA, nrB;
  scanf("%d %d %d\n", &n, &nrA, &nrB);
  a = readVector(nrA);
  b = readVector(nrB);
}

int getBeers(vector <int> &v, int time) {
  int sol = 0;
  for(unsigned i = 0; i < v.size(); ++i)
    sol += time / v[i];
  return sol;
}

int getTime(vector <int> &v) {
  int le = 1, ri = inf, mi;
  int sol = inf;

  while(le <= ri) {
    mi = ((ll)le+ri)>>1;
    if(getBeers(v, mi) >= n) sol = mi, ri = mi-1;
    else le = mi+1;
  }

  return sol;
}


void solve() {

  sort(a.begin(), a.end());
  sort(b.begin(), b.end());

  //writeVector(a);
  //writeVector(b);

  ta = getTime(a);
  tb = getTime(b);

  tot = ta+tb;
}

void write() {
  printf("%d %d\n", ta, tot);
}

int main() {
  freopen(infile, "r", stdin);
  freopen(outfile, "w", stdout);

  read();
  solve();
  write();

  fclose(stdin);
  fclose(stdout);
  return 0;
}