Pagini recente » Cod sursa (job #1047920) | Cod sursa (job #2727112) | Cod sursa (job #1042007) | Cod sursa (job #2461550) | Cod sursa (job #1219884)
#include <cstdio>
#include <algorithm>
#define MAXN 100000
#define MAXC 1000
#define MAXT 1000
#define MAXM 1000000000
#define MAXTIMECHECK 40000000
using namespace std;
struct cam {
int t, c, b;
};
cam trucks[MAXN];
int n, m;
bool dsb(cam x, cam y) {
return x.b > y.b;
}
inline long long nrb(int time, int ind) {
long long k = trucks[ind].c * (time / (2 * trucks[ind].t));
return k;
}
inline bool check(int time) {
long long bottles = 0;
for (int i = 0 ; i < n && bottles < m ; ++i)
bottles += nrb(time, i);
if (bottles < m)
return false;
return true;
}
int main () {
FILE *f, *g;
f = fopen("garaj.in", "r");
g = fopen("garaj.out", "w");
fscanf(f, "%d%d", &n, &m);
for (int i = 0 ; i < n ; ++i)
fscanf(f, "%d%d", &trucks[i].c, &trucks[i].t);
long long start = 1, stop = MAXTIMECHECK, mid;
long long tm;
while (stop - start > 1) {
mid = (start + stop) >> 1;
if (check(mid))
stop = mid, tm = mid;
else
start = mid;
}
int tmin = tm;
for (int i = 0 ; i < n ; ++i)
trucks[i].b = nrb(tmin, i);
sort(trucks, trucks + n, dsb);
long long bottles = 0;
int i = 0, nrmin = 0;
while (bottles < m ) {
++nrmin;
bottles += trucks[i++].b;
}
fprintf(g, "%d %d\n", tmin, nrmin);
fclose(f);
fclose(g);
return 0;
}