Cod sursa(job #596366)

Utilizator Smaug-Andrei C. Smaug- Data 16 iunie 2011 23:03:27
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <cstdio>
#include <functional>
#include <algorithm>
using namespace std;

#define MAXN 100010
#define HIGH (1<<25)

inline int check(int N, int M, int t, int *C, int *D){

  int i, sum=0;
  for(i=1; i<=N; i++){
    sum+=(t/D[i])*C[i];
    if(sum >= M)
      return 1;
  }

  return 0;

}

int main(){

  freopen("garaj.in", "r", stdin);
  freopen("garaj.out", "w", stdout);

  int N, M, i, l, r, mid, time, sum;
  static int C[MAXN], D[MAXN], A[MAXN];

  scanf("%d%d", &N, &M);
  for(i=1; i<=N; i++)
    scanf("%d%d", C+i, D+i);

  for(i=1; i<=N; i++)
    D[i]=D[i]<<1;

  l=1; r=HIGH; 

  while(l<=r){
    mid=((r-l)>>1)+l;
    if(check(N, M, mid, C, D))
      r=mid-1;
    else
      l=mid+1;
  }

  time=l;

  for(i=1; i<=N; i++)
    A[i]=time/D[i]*C[i];

  sort(A+1, A+N+1, greater<int>());

  sum=0;
  for(i=1; i<=N; i++){
    sum+=A[i];
    if(sum>=M)
      break;
  }

  printf("%d %d\n", time, i);

  return 0;

}