Cod sursa(job #1490518)

Utilizator hrazvanHarsan Razvan hrazvan Data 23 septembrie 2015 18:36:15
Problema Garaj Scor 50
Compilator c Status done
Runda Arhiva de probleme Marime 1.82 kb
#include <stdio.h>
#define MAXN 100000
#define BUFF (1 << 20)
FILE *in;
int c[MAXN], t[MAXN];
char ssin[BUFF];
int pin = BUFF;

inline char cif(char ch){
  if(ch >= '0' && ch <= '9')
    return 1;
  return 0;
}

inline char getcharr(){
  if(pin == BUFF){
    fread(ssin, 1, BUFF, in);
    pin = 0;
  }
  pin++;
  return ssin[pin - 1];
}

inline long long getnumm(){
  char ch = getcharr();
  long long rez = 0;
  while(!cif(ch))
    ch = getcharr();
  while(cif(ch)){
    rez *= 10;
    rez += ch - '0';
    ch = getcharr();
  }
  return rez;
}

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(){
  in = fopen("garaj.in", "r");
  int n, m, i;
  n = (int)getnumm();  m = (int)getnumm();
   for(i = 0; i < n; i++){
    c[i] = (int)getnumm();  t[i] = (int)getnumm();
    t[i] *= 2;
  }
  fclose(in);
  long long tp = 0, pas;
  for(pas = (1LL << 29); 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;
}