Pagini recente » Cod sursa (job #2077817) | Cod sursa (job #1256103) | Cod sursa (job #405995) | Cod sursa (job #2436114) | Cod sursa (job #178880)
Cod sursa(job #178880)
#include<stdio.h>
#define Nmax 100010
int C[Nmax], T[Nmax];
int N,M;
int timp(long long Tmax){
long long total = 0;
for(int i=1;i<=N;i++)
total += (long long)C[i]*(Tmax / (2*T[i]));
if(total >= (long long)M)
return 1;
return 0;
}
int main(){
FILE *fin = fopen("garaj.in","r"),
*fout = fopen("garaj.out","w");
fscanf(fin,"%d%d",&N,&M);
for(int i=1;i<=N;i++)
fscanf(fin,"%d%d",&C[i],&T[i]);
long long li = 0, lf = (long long)1000000000 * (long long) 4000, mij;
while(lf-li>1){
mij = (li+lf)>>1;
if(timp(mij))
lf = mij;
else
li = mij;
}
long long Tmin;
if(timp(li))
Tmin = li;
else
Tmin = lf;
fprintf(fout,"%lld ",Tmin);
for(int i=1;i<=N;i++)
C[i] = C[i]*(Tmin / (2*T[i]));
//sort C
for(int i=1;i<=N;i++){
int j = i;
while(j/2 && C[j/2] > C[j]){
int aux = C[j/2];
C[j/2] = C[j];
C[j] = aux;
j>>=1;
}
}
int cate = N;
while(cate>1){
int aux = C[1];
C[1] = C[cate];
C[cate] = aux;
cate--;
int j=1;
while(1){
int k = 2*j;
if(k>cate) break;
if(k+1<=cate && C[k+1] < C[k]) k++;
if(C[j] < C[k]) break;
aux = C[j];
C[j] = C[k];
C[k] = aux;
j = k;
}
}
int Nrmin = 0, total = 0;
while(total < M){
Nrmin++;
total += C[Nrmin];
}
fprintf(fout,"%d\n",Nrmin);
fclose(fin);
fclose(fout);
return 0;
}