Cod sursa(job #851897)

Utilizator stoicatheoFlirk Navok stoicatheo Data 10 ianuarie 2013 16:36:33
Problema Garaj Scor 60
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;
}