Pagini recente » Cod sursa (job #1604645) | Cod sursa (job #1069520) | Cod sursa (job #2669709) | Cod sursa (job #1364504) | Cod sursa (job #143262)
Cod sursa(job #143262)
#include <stdio.h>
#include <algorithm>
using namespace std;
long long i, j, k, n, m, timp, lolol;
struct lol
{
long long q, t, p, r;
};
lol c[100001];
int cmpf(lol a, lol b)
{
return a.p > b.p;
}
int ok(long long timp)
{
long long sum = 0;
for (long long i = 1; i <= n && sum < m; i ++)
sum += c[i].q * (timp / c[i].t);
if (sum >= m)
return 1;
return 0;
}
long long realizabil(long long timp)
{
long long mc = m;
lolol = timp;
for (i = 1; i <= n; i ++)
c[i].p = (timp / c[i].t) * c[i].q;
sort(c + 1, c + n + 1, cmpf);
for (i = 1; i <= n && mc > 0; i ++)
{
mc = mc - (timp / c[i].t * c[i].q);
}
if (mc <= 0)
return i - 1;
return -1;
}
void cautbin(long long st, long long dr)
{
long long m = (st + dr) / 2;
long long k = ok(m);
if (st >= dr || dr - st == 1)
{
if (k)
timp = timp > m ? m : timp;
k = ok(m + 1);
if (k)
timp = timp > (m + 1) ? (m + 1) : timp;
return ;
}
if (k)
{
timp = timp > m ? m : timp;
cautbin(st, m);
}
else
cautbin(m, dr);
}
int main()
{
freopen ("garaj.in", "rt", stdin);
freopen ("garaj.out", "wt", stdout);
scanf("%lld %lld", &n, &m);
for (i = 1; i <= n; i ++)
{
scanf("%lld %lld", &c[i].q, &c[i].t);
c[i].t *= 2;
}
timp = 1337000000000000LL;
cautbin(1, (m / c[1].q + m % c[1].q) * c[1].t);
printf("%lld %lld", timp, realizabil(timp));
return 0;
}