Cod sursa(job #458)

Utilizator mockeBarca Cristian Mihai mocke Data 11 decembrie 2006 12:47:13
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
//100p
#include <stdio.h>
#include <string.h>
#define INF 2000000001
#define VMAX 101*101
#define NMAX 256

int Ta[NMAX], Tb[NMAX];
int M[NMAX][NMAX], Lt[NMAX][NMAX];
int LA[NMAX], LB[NMAX];
int i, j, N, L, R, k;


int dinamiq(int T)
{
    int i, j, k, V;

    memset(Lt, 0, sizeof(Lt));
    memset(M, 0, sizeof(M));

    for (i = 0; i <= 2 * L + 1; i++)
      for (j = 0; j <= 2 * L + 1; j++) M[i][j] = -INF;


    M[0][0] = 0;

    for (i = 0; i <= N - 1; i++)
    {
        for (j = 0; j <= L; j++)
            for (k = 0; k <= L; k++)
               if (M[i][j] != -INF && Ta[i + 1] * k <= T)
               {
                    V = (T - (Ta[i + 1] * k) )/Tb[i + 1];

                    if (M[i + 1][j + k] < M[i][j] + V)
                    {
                         M[i + 1][j + k] = M[i][j] + V;
                         Lt[i + 1][j + k] = k;
                    }
               }

        V = -INF;
     }

     return M[N][L] >= L;
}

int main()
{
   freopen("lapte.in", "r", stdin);
   freopen("lapte.out", "w", stdout);

   scanf("%d %d", &N, &L);

   for (i = 1; i <= N; i++)
          scanf("%d %d", &Ta[i], &Tb[i]);

   int l = 0;
   int r = VMAX;
   int c, rez;

   while ( l <= r)
   {
       c = (l + r)/2;
       rez = dinamiq(c);

       if (rez)
       {
          R = c;
          r = c - 1;
       }
       else l = c + 1;
   }

   printf("%d\n", R);

   rez = dinamiq(R);

   k = N;
   j = L;

   while (k > 0)
   {
          LA[k] = Lt[k][j];
          LB[k] = (R - (Ta[k] * LA[k]) )/Tb[k];

          j = j - Lt[k][j];
          k--;
   }

   for (i = 1; i <= N; i++) printf("%d %d\n", LA[i], LB[i]);

   fclose(stdin);
   fclose(stdout);
   return 0;
}