Pagini recente » Cod sursa (job #951691) | Cod sursa (job #1173934) | Cod sursa (job #2829461) | Cod sursa (job #2852590) | Cod sursa (job #167977)
Cod sursa(job #167977)
#include <stdio.h>
#define NM 100001
int n, m;
int c[NM], t[NM];
int i, j, k;
int tmin, cmin;
void Qsort(int st, int dr);
void Cbin();
int Ok(int k);
int main()
{
freopen("garaj.in", "r", stdin);
freopen("garaj.out", "w", stdout);
scanf("%d %d", &n, &m);
for ( i = 1; i <= n; i++ )
scanf("%d %d", &c[i], &t[i]);
Cbin(); // tmin
// cmin
int can = 0, ture;
for ( i = 1; i <= n; i++ )
ture = tmin/(2*t[i]),
c[i] = ture*c[i];
Qsort(1, n);
for ( i = 1; i <= n; i++ )
{
can += c[i];
if ( can >= m )
break;
}
cmin = i;
printf("%d %d\n", tmin, cmin);
return 0;
}
void Qsort(int st, int dr)
{
int i = st-1;
int j = dr+1;
do
{
do { i++; } while ( c[i] > c[st] );
do { j--; } while ( c[st] > c[j] );
if ( i <= j )
{
int aux = c[i]; c[i] = c[j]; c[j] = aux;
}
} while ( i <= j );
if ( i < dr ) Qsort(i, dr);
if ( st < j ) Qsort(st, j);
}
void Cbin()
{
int st = 0;
int dr = 1000000;
while ( st != dr )
{
int mij = st + (dr-st)/2;
if ( Ok(mij) ) dr = mij;
else st = mij+1;
}
tmin = st;
}
int Ok(int k)
{
int ture;
int can = 0;
for ( i = 1; i <= n; i++ )
{
ture = k/(2*t[i]);
can += ture*c[i];
if ( can >= m ) return 1;
}
return 0;
}