Cod sursa(job #1490516)

Utilizator hrazvanHarsan Razvan hrazvan Data 23 septembrie 2015 18:32:57
Problema Garaj Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#define MAXN 100000
int c[MAXN], t[MAXN];

void qs(int st, int dr, long long tp){
  int i = st, j = dr, aux;
  long long piv = 1LL * c[(st + dr) / 2] * (tp / t[(st + dr) / 2]);
  while(i <= j){
    while(1LL * c[i] * (tp / t[i]) < piv)
      i++;
    while(1LL * c[j] * (tp / t[j]) > piv)
      j--;
    if(i <= j){
      aux = c[i];  c[i] = c[j];  c[j] = aux;
      aux = t[i];  t[i] = t[j];  t[j] = aux;
      i++;  j--;
    }
  }
  if(st < j)
    qs(st, j, tp);
  if(i < dr)
    qs(i, dr, tp);
}

inline char calc(long long tp, int n, int m){
  long long sum = 0;
  int i;
  for(i = 0; i < n; i++){
    sum += 1LL * c[i] * (tp / t[i]);
    if(sum >= m)
      return 1;
  }
  return 0;
}

int main(){
  FILE *in = fopen("garaj.in", "r");
  int n, m, i;
  fscanf(in, "%d%d", &n, &m);
   for(i = 0; i < n; i++){
    fscanf(in, "%d%d", &c[i], &t[i]);
    t[i] *= 2;
  }
  fclose(in);
  long long tp = 0, pas;
  for(pas = (1LL << 39); pas > 0; pas >>= 1){
    if(!calc(tp + pas, n, m))
      tp += pas;
  }
  tp++;
  qs(0, n - 1, tp);
  int sum = 0;
  i = n - 1;
  while(sum < m){
    sum += 1LL * c[i] * (tp / t[i]);
    i--;
  }
  i++;
  FILE *out = fopen("garaj.out", "w");
  fprintf(out, "%lld %d", tp, n - i);
  fclose(out);
  return 0;
}