Pagini recente » Cod sursa (job #1854767) | Cod sursa (job #1315207) | Cod sursa (job #1610976) | Cod sursa (job #3254664) | Cod sursa (job #448092)
Cod sursa(job #448092)
#include <iostream>
#include <fstream>
#define file_in "lapte.in"
#define file_out "lapte.out"
#define NMAX 101
#define CMAX 101
#define UNRCH (-CMAX)
#define NAT_ISSUE 2
#define A 0
#define B 1
#define MAX(a,b) ( (a)>(b)?(a):(b) )
int N, L;
int T[NMAX][2];
int t;
int lB[NMAX][CMAX];
int la[NMAX][CMAX];
using namespace std;
int reach_quantity ( void ) {
int n, lA;
for(n=1;n<=N;++n)
for(lA=0;lA<=CMAX;++lA)
lB[n][lA]=0, la[n][lA]=0;
int l, lb, ta, val;
for(lA=0;lA<=L;++lA) {
if ( (ta=lA*T[1][A]) > t ) lB[1][lA] = UNRCH;
else {
la[1][lA] = lA;
lB[1][lA] = (t-ta) / T[1][B];
}
}
for(n=2;n<=N;++n)
for(lA=0;lA<=L;++lA)
for(l=0;l<=lA;++l) {
if ( (ta=l*T[n][A]) > t ) break;
lb = (t-ta) / T[n][B];
if ( lB[n-1][lA-l] != UNRCH && (lB[n][lA] < (val = lB[n-1][lA-l] + lb)) )
lB[n][lA] = val, la[n][lA] = l;
}
if ( lB[N][L] >= L ) return 1;
return 0;
}
void binary_search ( int start , int end ) {
if ( start == end ) {
t = end;
reach_quantity ();
return;
}
t = (start+end)/2;
if ( reach_quantity () ) binary_search (start, t);
else binary_search (t+1,end);
}
int main ( void ) {
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
/* READ */
cin >> N >> L;
for(int n=1;n<=N;++n)
cin>> T[n][A] >> T[n][B];
/* END READ */
binary_search(1,2*CMAX*CMAX);
/* WRITE */
cout << t << endl;
int V[NMAX];
for (int n=N, l=L; n>=1 ; --n ) {
V[n] = la[n][l];
l-=la[n][l];
}
for (int n=1; n<=N; ++n)
cout << V[n] << " " << ( t - V[n] * T[n][A] ) / T[n][B] << endl;
//cout << "V[N]=" << la[N][L] << endl;
/* END WRITE */
/*
for (int i = 1; i<=2*L*L ; ++i ) {
t = i;
cout << i << " " << reach_quantity () << endl;;
}
*/
/*
t = 18;
reach_quantity();
cout << endl;
for(int n=1;n<=N;++n, cout << endl)
for(int lA=0;lA<=L;++lA, cout << " ")
cout<<lB[n][lA];
cout << endl;
for(int n=1;n<=N;++n, cout << endl)
for(int lA=0;lA<=L;++lA, cout << " ")
cout<<la[n][lA];
*/
return 0;
}