Pagini recente » Cod sursa (job #561348) | Cod sursa (job #2733630) | Cod sursa (job #831874) | Cod sursa (job #1857785) | Cod sursa (job #137930)
Cod sursa(job #137930)
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
const int N_MAX = 100010;
pair <int, int> v[N_MAX];
long long timp, rez[N_MAX];
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 cmp(int a, int b)
{
return (a > b);
}
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;
for (i = 1; i <= N; i ++) {
rez[i] = (long long) (v[i].first * (long long) (timp / (2 * v[i].second)));
}
sort(rez + 1, rez + N + 1, cmp);
int nrc = 0;
long long cate = 0;
for (i = 1; i <= N; i ++) {
cate += rez[i];
nrc ++;
if (cate >= M) break;
}
printf("%lld %d\n", timp, nrc);
return 0;
}