Pagini recente » Cod sursa (job #943583) | Cod sursa (job #1551937) | Cod sursa (job #2945540) | Cod sursa (job #2080780) | Cod sursa (job #137843)
Cod sursa(job #137843)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int N_MAX = 100010;
pair <int, int> v[N_MAX];
long long timp;
int cmp(pair <int, int> a, pair <int, int> b)
{
return ((long long) (a.first * (timp / (2 * a.second))) > (long long) (b.first * (timp / (2 * b.second))));
}
long long MAXIM = 1LL << 60;
int N, M;
int merge(long long val)
{
int i;
long long cate = 0;
for (i = 1; i <= N; i ++) {
cate += (long long) v[i].first * (long long) (val / (2 * v[i].second));
if (cate >= M) break;
}
// printf("val = %lld cate = %lld M = %d\n", val, cate, M);
if (cate >= M) return 1;
return 0;
}
long long bs()
{
long long step, i;
for (step = 1; step <= MAXIM; step <<= 1);
for (i = 0; step; step >>= 1) {
if (i + step <= MAXIM && !merge(i + step)) i += step;
}
return i;
}
int main()
{
freopen("garaj.in", "r", stdin);
#ifndef _SCREEN_
freopen("garaj.out", "w", stdout);
#endif
int i, x, y;
scanf("%d %d\n", &N, &M);
for (i = 1; i <= N; i ++) {
scanf("%d %d\n", &x, &y);
v[i] = make_pair(x, y);
}
timp = bs() + 1;
sort(v + 1, v + N + 1, cmp);
int nrc = 0;
long long cate = 0;
for (i = 1; i <= N; i ++) {
cate += (long long) (v[i].first * (long long) (timp / (2 * v[i].second)));
nrc ++;
if (cate >= M) break;
}
printf("%lld %d\n", timp, nrc);
return 0;
}