Cod sursa(job #469867)

Utilizator hendrikHendrik Lai hendrik Data 9 iulie 2010 13:26:14
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;

#define FOR(i,a,b) for (int i=(a);i<=(b);i++)
#define N 101
const int oo=(int)1e9;
int n,l,a[N],b[N],dp[N][N],lo,hi,mid,ans,pre[N][N],ansa[N],ansb[N];

void open(){
	freopen("lapte.in","r",stdin);
	freopen("lapte.out","w",stdout);
}

void input(){
	scanf("%d%d",&n,&l);
	FOR(i,1,n){
		scanf("%d%d",&a[i],&b[i]);
	}
}

bool ok(int x){
	FOR(i,0,n){
		FOR(j,0,l){
			dp[i][j]=-oo;
		}
	}
	dp[0][0]=0;
	FOR(i,1,n){
		dp[i][0]=0;
		FOR(j,0,l){
			FOR(k,0,j){
				int ta,tb;
				ta=k*a[i];
				if (ta>x) break;
				tb=(x-ta)/b[i];
				if (dp[i-1][j-k]!=-oo){
					int val=dp[i-1][j-k]+tb;
					if (dp[i][j]<val){
						dp[i][j]=val;
						pre[i][j]=k;
					}
				}
			}
		}
	}
	return dp[n][l]>=l;
}

void solve(){
	lo=0;hi=50000;
	while (1){
		mid=(lo+hi)>>1;
		if (ok(mid)){
			ans=mid;
			hi=mid-1;
		}
		else lo=mid+1;
		if (lo>hi) break;
	}
	ok(ans);
	printf("%d\n",ans);
	int nx,ny;
	ny=l;
	for (int i=n;i>=1;i--){
		ansa[i]=pre[i][ny];
		ansb[i]=(ans-pre[i][ny]*a[i])/b[i];
		ny=ny-pre[i][ny];
	}
	FOR(i,1,n){
		printf("%d %d\n",ansa[i],ansb[i]);
	}
}

int main(){
	open();
	input();
	solve();
	//system("pause");
	return 0;
}