Pagini recente » Cod sursa (job #2495417) | Cod sursa (job #515547) | Cod sursa (job #1554329) | Cod sursa (job #2174991) | Cod sursa (job #28432)
Cod sursa(job #28432)
//029 Lapte - solutie greedy euristic & cautare binara nlog n
#include <stdio.h>
#include <stdlib.h>
#define INPUT "lapte.in"
#define OUTPUT "lapte.out"
#define MAX 101
int N, L, T;
struct pers
{
int ta, tb, n_ord;
int na, nb;
}v[MAX];
int comp(const void *a, const void *b)
{
if( (((pers*)a)->ta) * (((pers*)b)->tb) > (((pers*)b)->ta) * (((pers *)a)->tb)) return 1;
return -1;
}
int comp2(const void *a, const void *b)
{
if(((pers *)a) -> n_ord > ((pers*) b) -> n_ord) return 1;
return -1;
}
int OK(int tmax)
{
int i, la = 0, lb = 0, t;
for(i = 1; i <= N; ++i)
{
if(la < L)
{
if(L-la < tmax/v[i].ta)
t = tmax-v[i].ta*(L-la),
la = L;
else la += tmax/v[i].ta ,
t = tmax %v[i].ta;
}
else t = tmax;
lb += t/v[i].tb;
if(la >= L && lb >= L) return 1;
}
return 0;
}
int main()
{
freopen(INPUT, "r", stdin);
scanf("%d %d", &N, &L);
int i;
for(i = 1; i <= N; ++i)
scanf("%d %d", &v[i].ta, &v[i].tb),
v[i].n_ord = i;
qsort(v+1, N, sizeof(v[0]), comp);
int in = 0, sf = MAX, mij;
while(in < sf)
{
mij = (in + sf)/2;
if( OK(mij) ) sf = mij;
else in = mij + 1;
}
int tmax = in, t, la = 0, lb = 0;
for(i = 1; i <= N; ++i)
{
if(la < L)
{
if(L-la < tmax/v[i].ta)
t = tmax-v[i].ta*(L-la),
v[i].na = L - la,
la = L;
else v[i].na = tmax/v[i].ta,
la += v[i].na,
t = tmax %v[i].ta;
}
else t = tmax;
if(L - lb < t/v[i].tb )
v[i].nb = L - lb,
lb = L;
else v[i].nb = t/v[i].tb,
lb += v[i].nb;
}
qsort(v+1, N, sizeof(v[0]), comp2);
freopen(OUTPUT, "w", stdout);
printf("%d\n", in);
for(i = 1; i <= N; ++i)
printf("%d %d\n", v[i].na, v[i].nb);
return 0;
}