Cod sursa(job #662042)

Utilizator unsilviuContvechidontdeactivatepls unsilviu Data 15 ianuarie 2012 18:50:15
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <fstream>
#include <string.h>
using namespace std;
int v[101][101],A[101],B[101],l,n,T,sol[2][101],cr[101][101],wak;

int ver(int t) {
	int i,j,x[101][101],var,dund[101][101];
	memset (x,-1,sizeof(x));
	x[0][0]=0;
	for (i=1; i<=n; i++)
		for (j=0; j<=l; j++)
			for (var=0; var<=t; var++)
				if (j-var/A[i]>=0)
					if (x[i-1][j-var/A[i]]>=0)
						if (x[i-1][j-var/A[i]]+(t-var)/B[i]>x[i][j]) {
							dund[i][j]=j-var/A[i];
							x[i][j]=x[i-1][j-var/A[i]]+(t-var)/B[i];
						}
	if (x[n][l]>=l) {
		memcpy(v,x,sizeof(x));
		for (i=2; i<=n; i++)
			for (j=0; j<=l; j++)
				cr[i][j]=dund[i][j];
		return 1;
	}
	else return 0;
}
				
	
void bs(int lo, int hi) {
	int mid;
	if (hi>=lo) {
		mid=lo+(hi-lo)/2;
		if (ver(mid)) {
			T=mid;
			bs(lo,mid-1);
		}
		else bs(mid+1,hi);
	}
}
	
int main() {
	ifstream f("lapte.in");
	ofstream g("lapte.out");
	f>>n>>l;
	int i;
	for (i=1; i<=n; i++)
		f>>A[i]>>B[i];
	bs(1,101);
	g<<T<<'\n';
	wak=l;
	for (i=n; i>=1; i--) {
		sol[0][i]=wak-cr[i][wak];
		sol[1][i]=v[i][wak]-v[i-1][cr[i][wak]];
		wak=cr[i][wak];
	}
	for (i=1; i<=n; i++)
		g<<sol[0][i]<<' '<<sol[1][i]<<'\n';
	g.close();
	return 0;
}