Cod sursa(job #209007)

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

int n , m ;
int a[100+30], b[100+30] ;
int g[100+30][100+30];
int v[100+30][100+30][2];
int sol[100+30][2];

void
readInput ( ) {
  ifstream is ( "lapte.in"  ) ;
  int i ;
  is >> n >> m ;
  for ( i = 0 ; n > i ; ++ i ) {
    is >> a[i] ;
    is >> b[i] ;
  }
}

void
eval ( int t ) {
  int u , x , k , s , q ;
  for ( u = 0 ; m >= u ; ++ u ) {
    for ( x = 0 ; m >= x ; ++ x ) {
      g[u][x] = 0 ;
    }
  }
  g[0][0] = 1 ;
  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 = min(u,t/a[k]); 0 <= s ; -- s ) {
          q = (t-s*a[k])/b[k];
          if (g[u-s][max(0,x-q)]) {
            g[u][x] = 1 ; v[u][x][0]=k ; v[u][x][1]=s ;
            // cout << "(u,x,k,s): " << u << ' ' << x << ' ' << k << ' ' << s << endl ;
            break ;
          }
        }
      }
    }
  }
}

void
writeSolution ( int t ) {
  ofstream os ( "lapte.out" ) ;
  int i , u , x , s , q , k ;
  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;
    (u<=s) ? u = 0 : u -= s;
    (x<=q) ? x = 0 : x -= q;
  }
  os << t << endl ;
  for(i=0;i<n;i++) {
    os << sol[i][0] << ' ' << sol[i][1] << endl ;
  }

}

int
main ( ) {
  readInput ( ) ;
  int lo = 1 , hi = 100 , t ;
  while (lo < hi) {
    t = ( lo + hi ) / 2 ;
    // cout << "t: " << t << endl ;
    eval ( t ) ;
    if ( g[m][m] ) {
      hi = t ;
    } else {
      lo = t+1;
    }
  }
  if (lo > t) {
    eval ( lo ) ;
    t = lo ;
  }
  writeSolution ( t ) ;
  return 0 ;
}