Cod sursa(job #559285)

Utilizator rusu_raduRusu Radu rusu_radu Data 17 martie 2011 19:08:19
Problema Garaj Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>
#include <cassert>
#include <algorithm>
#define Nmax 100005
#define InFile "garaj.in"
#define OutFile "garaj.out"

using namespace std;

int n, m, Sl, tmp, St[Nmax];
struct {int c, t;} T[Nmax];

void read();
void solve();
inline bool cmp (int a, int b) {return a>b;}
int verif (int);
int binara (int, int);
void write();

int main()
{
  assert (freopen (InFile, "r", stdin));
  assert (freopen (OutFile, "w", stdout));
  read();
  solve();
  write();
  return 0;
}

void read()
{
  int i;
  scanf ("%d %d\n", &n, &m);
  for (i=1; i<=n; i++)
    scanf ("%d %d\n", &T[i].c, &T[i].t), T[i].t*=2;
}

void solve()
{
  int i;
  long long sum;
  tmp=binara (1, (int)1e9);
  for (i=1; i<=n; i++)
    St[i]=tmp/T[i].t*T[i].c;
  sort (St+1, St+n+1, cmp);
  Sl=0;
  sum=0;
  for (i=1; i<=n && sum<m; i++)
  {
    sum+=St[i];
    Sl++;
  }
}

int binara (int st, int dr)
{
  int mij, p=dr;
  while (st<=dr)
  {
    mij=st+(dr-st)/2;
    if (verif (mij))
    {
      p=mij;
      dr=mij-1;
    }
    else
      st=mij+1;
  }
  return p;
}

void write()
{
  printf ("%d %d\n", tmp, Sl);
}

int verif (int x)
{
  int i;
  long long sum=0;
  for (i=1; i<=n && sum<m; i++)
    sum+=x/T[i].t*T[i].c;
  if (sum>=m)
    return 1;
  return 0;
}