Pagini recente » Istoria paginii utilizator/andreipavel213 | Cod sursa (job #2165364) | Istoria paginii runda/eusebiu_oji_2018_cls9 | Cod sursa (job #1290930) | Cod sursa (job #209006)
Cod sursa(job #209006)
#include <fstream>
#include <iostream>
using namespace std ;
int n , m ;
int a[100], b[100] ;
bool g[101][101];
int v[101][101][2];
int sol[100][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] = false ;
}
}
g[0][0] = true ;
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];
if (g[max(0,u-s)][max(0,x-q)] ) {
g[u][x] = true ; 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;
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 ;
}
}
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 ;
}