Pagini recente » Cod sursa (job #1921037) | Cod sursa (job #2188661) | Cod sursa (job #1322095) | Cod sursa (job #1291804) | Cod sursa (job #1490524)
#include <stdio.h>
#define MAXN 100000
#define BUFF (1 << 20)
FILE *in;
int c[MAXN], t[MAXN];
char ssin[BUFF];
int pin = BUFF;
inline char cif(char ch){
if(ch >= '0' && ch <= '9')
return 1;
return 0;
}
inline char getcharr(){
if(pin == BUFF){
fread(ssin, 1, BUFF, in);
pin = 0;
}
pin++;
return ssin[pin - 1];
}
inline long long getnumm(){
char ch = getcharr();
long long rez = 0;
while(!cif(ch))
ch = getcharr();
while(cif(ch)){
rez *= 10;
rez += ch - '0';
ch = getcharr();
}
return rez;
}
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(){
in = fopen("garaj.in", "r");
int n, m, i;
n = (int)getnumm(); m = (int)getnumm();
for(i = 0; i < n; i++){
c[i] = (int)getnumm(); t[i] = (int)getnumm();
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);
long long 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;
}