Pagini recente » Monitorul de evaluare | Cod sursa (job #607607) | Cod sursa (job #2556497) | Cod sursa (job #1226653) | Cod sursa (job #1490516)
#include <stdio.h>
#define MAXN 100000
int c[MAXN], t[MAXN];
void qs(int st, int dr, long long tp){
int i = st, j = dr, aux;
long long piv = 1LL * c[(st + dr) / 2] * (tp / t[(st + dr) / 2]);
while(i <= j){
while(1LL * c[i] * (tp / t[i]) < piv)
i++;
while(1LL * c[j] * (tp / t[j]) > piv)
j--;
if(i <= j){
aux = c[i]; c[i] = c[j]; c[j] = aux;
aux = t[i]; t[i] = t[j]; t[j] = aux;
i++; j--;
}
}
if(st < j)
qs(st, j, tp);
if(i < dr)
qs(i, dr, tp);
}
inline char calc(long long tp, int n, int m){
long long sum = 0;
int i;
for(i = 0; i < n; i++){
sum += 1LL * c[i] * (tp / t[i]);
if(sum >= m)
return 1;
}
return 0;
}
int main(){
FILE *in = fopen("garaj.in", "r");
int n, m, i;
fscanf(in, "%d%d", &n, &m);
for(i = 0; i < n; i++){
fscanf(in, "%d%d", &c[i], &t[i]);
t[i] *= 2;
}
fclose(in);
long long tp = 0, pas;
for(pas = (1LL << 39); pas > 0; pas >>= 1){
if(!calc(tp + pas, n, m))
tp += pas;
}
tp++;
qs(0, n - 1, tp);
int sum = 0;
i = n - 1;
while(sum < m){
sum += 1LL * c[i] * (tp / t[i]);
i--;
}
i++;
FILE *out = fopen("garaj.out", "w");
fprintf(out, "%lld %d", tp, n - i);
fclose(out);
return 0;
}