Pagini recente » Cod sursa (job #139378) | Cod sursa (job #195716) | Cod sursa (job #490475) | Cod sursa (job #1070410) | Cod sursa (job #260380)
Cod sursa(job #260380)
#include<stdio.h>
FILE *fin=fopen("garaj.in","r"),
*fout=fopen("garaj.out","w");
int N,M,C[100005],T[100005];
int merge(int t){
int cate=0;
for(int i=1;i<=N;i++)
cate+=t/(2*T[i])*C[i];
if(cate>=M)
return 1;
return 0;
}
void swap(int i,int j){
C[i]^=C[j];C[j]^=C[i];C[i]^=C[j];
}
int main(){
fscanf(fin,"%d %d",&N,&M);
for(int i=1;i<=N;i++)
fscanf(fin,"%d %d",&C[i],&T[i]);
int li=1,lf=1000*1000;
while(lf-li>1){
int mij=(li+lf)>>1;
if(merge(mij))
lf=mij;
else
li=mij;
}
int Tmin;
if(merge(li))
Tmin=li;
else
Tmin=lf;
fprintf(fout,"%d ",Tmin);
for(int i=1;i<=N;i++){
C[i]=Tmin/(2*T[i])*C[i];
int j=i;
while(j/2 && C[j]<C[j/2]){
swap(j,j/2);
j>>=1;
}
}
int Nh=N;
while(Nh>1){
swap(1,Nh);
--Nh;
int i=1,j;
while(1){
j=2*i;
if(j>Nh) break;
if(j+1<=Nh && C[j+1]<C[j]) ++j;
if(C[j/2]<C[j]) break;
swap(j,j/2);
i=j;
}
}
int cnt=0;
for(int i=1;i<=N&&M>0;M-=C[i],i++,cnt++);
fprintf(fout,"%d\n",cnt);
fclose(fin);
fclose(fout);
return 0;
}