Cod sursa(job #207368)

Utilizator mgntMarius B mgnt Data 12 septembrie 2008 12:01:32
Problema Lapte Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <fstream>
using namespace std ;

int a[100], b[100] ;
bool g[101][101]; 
int v[101][101][2];
int sol[100][2];

int
main ( ) {
  ifstream is ( "lapte.in"  ) ;
  ofstream os ( "lapte.out" ) ;
  int n , m , i , lo, hi , t, u , x , k , s , q ;
  is >> n >> m ;
  for ( i = 0 ; n > i ; ++ i ) {
    is >> a[i] ;
    is >> b[i] ;
  }
  lo = 1, hi = 100 ;
  while (lo < hi) {
    t = ( lo + hi ) / 2 ;
    for ( u = 0 ; m >= u ; ++ u ) {
      for ( x = 0 ; m >= x ; ++ x ) {
        g[u][x] = false ;
      }
    }
    bool b2 ;
    for ( k = 0 ; n > k ; ++ k ) {
      for ( u = m ; 0 <= u ; -- u ) {
        for ( x = m ; 0 <= x ; -- x ) {
          if (g[u][x]) continue ;
          for ( s = t/a[k]; 0 <= s ; -- s ) {
            q = (t-s*a[k])/b[k];
            b2 = false ;
            if ((u <= s) && (x <= q)) {
              b2 = true ;
            } else if (u <= s) {
              b2 = g[0][x-q] ;
            } else if (x <= q) {
              b2 = g[u-s][0] ;
            } else {
              b2 = g[u-s][x-q] ;
            }
            if (b2) {
              g[u][x] = true ; v[u][x][0]=k ; v[u][x][1]=s ; break ;
            }
          }
        }
      }
    }
    if ( g[m][m] ) {
      hi = t ;
    } else {
      lo = t+1;
    }
  }
  t = lo ;
  for (i=0;i<n;i++) {
    sol[i][0]=0;
    sol[i][1]=0;
  }
  u=m;
  x=m;
  while(0!=u || 0!=x) {
    k=v[u][x][0];
    s=v[u][x][1];
    q=(t-s*a[k])/b[k];
    sol[k][0]=s;
    sol[k][1]=q;
    if(u<=s && x<=q) u=0,x=0; else u-=s,x-=q;
  }
  os << t << endl ;
  for(i=0;i<n;i++) {
    os << sol[i][0] << ' ' << sol[i][1] << endl ;
  }
  return 0 ;
}