Cod sursa(job #1347485)

Utilizator BLz0rDospra Cristian BLz0r Data 18 februarie 2015 23:29:17
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <cstdio>
#include <cstring>
using namespace std;

#define Nmax 102
#define inf 0x3f3f3f3f

FILE *f = fopen ( "lapte.in" , "r" );
FILE *g = fopen ( "lapte.out" , "w" );

int D[Nmax][Nmax], prev[Nmax][Nmax], N, L, sl;

struct bautor{
	int A, B;
}v[Nmax];

bool isSol ( int T ){
	
	memset ( D, -inf, sizeof ( D ) );
	memset ( prev, 0, sizeof ( prev ) );
	
	D[0][0] = 0;
	
	for ( int i = 0; i < N; ++i )
		for ( int j = 0; j <= L; ++j )
			for ( int k = 0; j + k <= L && k * v[i+1].A <= T; ++k ){
				
				int val = D[i][j] + ( T - k * v[i+1].A ) / v[i+1].B;
                
				if ( val > D[i+1][j+k] ){
                    D[i+1][j+k] = val;
                    prev[i+1][j+k] = j;
				}
			}
	
	return D[N][L] >= L;
}

void Afisare ( int x, int y ){
	
	if ( x == 0 ){
		fprintf ( g, "%d\n", sl );
		return;
	}
	
	Afisare ( x - 1, prev[x][y] );
	
	int a = y - prev[x][y];
	int b = ( sl - a * v[x].A ) / v[x].B;
	
	fprintf ( g, "%d %d\n", a, b );

}
	
int main(){
	int step;
	
	fscanf ( f, "%d%d", &N, &L );
	
	for ( int i = 1; i <= N; ++i )
		fscanf ( f, "%d%d", &v[i].A, &v[i].B );
	
    /*for ( step = 1; step < L; step <<= 1 );
    
	for ( sl = L; step ; step >>= 1 )
        if ( sl - step > 0 && isSol ( sl - step ) )
            sl -= step;
	*/
	
	int st = 1, dr = 100, mid;
	
	while ( st <= dr ){
		mid = ( st + dr ) >> 1;
		
		if ( isSol ( mid ) ){
			sl = mid;
			dr = mid - 1;
		}
		else
			st = mid + 1;
	}
	
	
	isSol ( sl );
	
	Afisare ( N, L );
	
	return 0;
}