Pagini recente » Cod sursa (job #86545) | Cod sursa (job #1123879) | Cod sursa (job #2634656) | Cod sursa (job #1775376) | Cod sursa (job #337659)
Cod sursa(job #337659)
#include <stdio.h>
#include <values.h>
#define nmax 100000
#define mmax 1000000000
#define inf INT_MAX
struct ceva
{
int c, t;
};
int n, m, x;
ceva cam [nmax+5];
void scan ()
{
int i;
scanf ("%d%d", &n, &m);
for (i=1; i <= n; ++i)
scanf ("%d%d", &cam [i].c, &cam [i].t);
}
bool ok (int x)
{
int i, ns=m;
for (i=1; i <= n; ++i)
{
ns -= (x/cam [i].t)*cam [i].c;
if (ns < 1)
return true;
}
return false;
}
int timpmin ()
{
int i, s;
//fprintf (stderr, "%d\n", inf);
s=1<<30;
for (i=0; s ; s >>= 1)
if (((unsigned int)i+s <= inf) && (!ok (i+s)))
i += s;
return ++i;
}
int partitie (int st, int dr)
{
int i=st-1, j=dr+1, piv=(x/cam [(i+j)>>1].t)*cam [(i+j)>>1].c;
ceva aux;
while (1)
{
do {++i;} while ((x/cam [i].t)*cam [i].c > piv);
do {--j;} while ((x/cam [j].t)*cam [j].c < piv);
if (i < j)
{
aux=cam [i];
cam [i]=cam [j];
cam [j]=aux;
}
else
return j;
}
}
void sort (int st, int dr)
{
if (st < dr)
{
int p=partitie (st, dr);
sort (st, p);
sort (p+1, dr);
}
}
int cammin ()
{
sort (1, n);
int i, ns=m;
// for (i=1; i <= n; ++i)
// fprintf(stderr, "%d\n", cam [i].c);
for (i=1; ns > 0 ; ++i)
// {
ns -= (x/cam [i].t) * cam [i].c;
// fprintf(stderr, "i=%d ns=%d\n", i, ns);
// }
return --i;
}
int main ()
{
freopen ("garaj.in", "r", stdin);
freopen ("garaj.out", "w", stdout);
scan ();
x=timpmin ();
//fprintf(stderr, "%d\n", x);
printf ("%d %d\n", x<<1, cammin ());
return 0;
}