Pagini recente » Cod sursa (job #1731579) | Cod sursa (job #196355) | Cod sursa (job #2104933) | Cod sursa (job #2262238) | Cod sursa (job #1262938)
#include <stdio.h>
#define EPSILON 0.000001
#define MAXN 100
int n, k, x[MAXN], y[MAXN], X[MAXN], Y[MAXN], poz[MAXN];
inline int tata(int a){
return (a-1)/2;
}
inline int fiust(int a){
return a*2+1;
}
inline int fiudr(int a){
return a*2+2;
}
inline void swap(int a, int b){
int aux=poz[a];
poz[a]=poz[b];
poz[b]=aux;
}
inline int trbSchimb(int a, int b){
return (x[poz[a]]*y[poz[b]]<x[poz[b]]*y[poz[a]]);
}
inline void coborare(int p){
int f, q;
f=1;
while((f==1)&&(fiust(p)<n)){
q=fiust(p);
if((fiudr(p)<n)&&(trbSchimb(fiudr(p), q)==1)){
q=fiudr(p);
}
if(trbSchimb(q, p)==1){
swap(p, q);
p=q;
}else{
f=0;
}
}
}
inline void heapify(){
int i;
for(i=tata(n-1); i>=0; i--){
coborare(i);
}
}
inline void heapSort(){
while(n>1){
n--;
swap(0, n);
coborare(0);
}
}
inline int lapte(int t){
int i, B, rez;
B=k;
i=0;
while((i<n)&&(B-t/y[poz[i]]>=0)){
X[poz[i]]=0;
Y[poz[i]]=t/y[poz[i]];
B-=t/y[poz[i]];
i++;
}
rez=0;
if(i<n){
X[poz[i]]=t/x[poz[i]]-B*y[poz[i]]/x[poz[i]];
Y[poz[i]]=B;
rez+=t/x[poz[i]]-B*y[poz[i]]/x[poz[i]];
i++;
while(i<n){
X[poz[i]]=t/x[poz[i]];
Y[poz[i]]=0;
rez+=t/x[poz[i]];
i++;
}
}
return rez;
}
int main(){
int cn, i, rez, pas;
FILE *fin, *fout;
fin=fopen("lapte.in", "r");
fout=fopen("lapte.out", "w");
fscanf(fin, "%d%d", &n, &k);
for(i=0; i<n; i++){
fscanf(fin, "%d%d", &x[i], &y[i]);
poz[i]=i;
}
heapify();
cn=n;
heapSort();
n=cn;
rez=0;
for(pas=1<<6; pas!=0; pas>>=1){
if(lapte(rez+pas)<k){
rez+=pas;
}
}
rez++;
fprintf(fout, "%d\n", rez);
i=lapte(rez);
for(i=0; i<n; i++){
fprintf(fout, "%d %d\n", X[i], Y[i]);
}
fclose(fin);
fclose(fout);
return 0;
}