Pagini recente » Cod sursa (job #2583806) | Cod sursa (job #2599376) | Cod sursa (job #2255635) | Cod sursa (job #1861182) | Cod sursa (job #1608388)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cctype>
using namespace std;
const int BUFF_SIZE = 100;
const int N = 100100;
struct Truck {
int t;
int c;
int pond;
bool operator <(const Truck &other) const {
return pond > other.pond;
}
};
int n, m;
char buff[BUFF_SIZE];
Truck tr[N];
inline int parse(int &i) {
int val = 0;
while(isdigit(buff[i])) {
val = val * 10 + buff[i++] - '0';
}
i++;
return val;
}
bool ok(int time) {
int i;
long long sum;
sum = 0;
for(i = 1; i <= n; i++) {
sum += 1LL * (time / (2 * tr[i].t)) * tr[i].c;
if(sum >= m) {
return 1;
}
}
return 0;
}
int main() {
freopen("garaj.in", "r", stdin);
freopen("garaj.out", "w", stdout);
int i, j, lo, hi, med, sum, time;
scanf("%d %d\n", &n, &m);
hi = 0;
for(i = 1; i <= n; i++) {
gets(buff);
tr[i].c = parse(j = 0);
tr[i].t = parse(j);
hi = max(hi, (m / tr[i].c + 1) * 2 * tr[i].t);
}
lo = 1;
while(lo <= hi) {
med = (lo + hi) >> 1;
if(ok(med)) {
hi = med - 1;
}
else {
lo = med + 1;
}
}
time = hi + 1;
for(i = 1; i <= n; i++) {
tr[i].pond = (time / (2 * tr[i].t)) * tr[i].c;
}
sort(tr+1, tr+n+1);
i = 1;
sum = 0;
while(sum < m) {
sum += tr[i].pond;
i++;
}
i--;
printf("%d %d\n", time, i);
return 0;
}