Cod sursa(job #63323)

Utilizator varuvasiTofan Vasile varuvasi Data 27 mai 2007 20:37:34
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <stdio.h>
#define MaxN 101
#define FOR(i, a, b) for (i = (a); i <= (b); i++)
#define FORD(i, a, b) for (i = (a); i >= (b); i--)

int N, L;
int A[MaxN], B[MaxN];
int lmax[MaxN][MaxN]; // cant maxima de lapte B pentru daca beau i litri lapte A
int nrl[MaxN][MaxN]; // nrl[i] - nr litri de tip A adaugat pentru a obtine i
int lapte[MaxN], tmin;


int check(int timp)
{
	int i, j, k;

	FOR(i, 0, 100)
		FOR(j, 0, 100) lmax[i][j] = -1, nrl[i][j] = 0;
	lmax[0][0] = 0;

	FOR(i, 1, N)
		FORD(j, L, 0)
			if (lmax[i-1][j] != -1)
				FORD(k, (timp / A[i]), 0)
				{
					if (lmax[i-1][j] + (timp - k*A[i]) / B[i] > lmax[i][j + k])
					{
						lmax[i][j + k] = lmax[i-1][j] + (timp - k*A[i]) / B[i];
						nrl[i][j + k] = k;
					}
				}

	if (lmax[N][L] >= L) return 1;
	return 0;
}

void afis(int i, int j)
{
	if (i == 0) return;
	afis(i - 1, j - nrl[i][j]);
	lapte[i] = nrl[i][j];
}

int main()
{
	int i, j;

	FILE *fin = fopen("lapte.in", "rt");
	FILE *fout = fopen("lapte.out", "wt");

	fscanf(fin, "%d %d", &N, &L);

	FOR(i, 1, N)
		fscanf(fin, "%d %d", &A[i], &B[i]);

    int st = 1, dr = 100;
    
    while (st <= dr)
    {   
        int mij = (st + dr) >> 1;
        if (check(mij))
        {
            tmin = mij;
            afis(N, L);
            dr = mij - 1;
        }
        else
            st = mij + 1;
    }
    
    
    fprintf(fout, "%d\n", tmin);
	FOR(i, 1, N)
		fprintf(fout, "%d %d\n", lapte[i], (tmin - lapte[i]*A[i]) / B[i]);
	fclose(fin);
	fclose(fout);

	return 0;
}