Cod sursa(job #315522)

Utilizator hadesgamesTache Alexandru hadesgames Data 16 mai 2009 09:10:54
Problema Lapte Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.15 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#include <set>
#include <algorithm>
#include <utility>
#include <string>
#include <functional>
#include <sstream>
#include <fstream>
#include <iostream>
#include <cstring>
using namespace std;
#define FOR(i,a,b) for (i=a;i<=b;i++)
#define fori(it,v) for (it=(v).begin();it!=(v).end();it++)
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define all(c) c.begin(),c.end()
#define pf push_front
#define popb pop_back
#define popf pop_front
FILE *in,*out;
pair<int,int> marc[105][105][105];
int L,n,a[105],b[105];
const int inf=1<<20;
int ver(int x)
{
	int i,j,k,q;
	memset(marc,0,sizeof(marc));
	marc[0][0][0].fi=inf;
	marc[0][0][0].se=inf;
	FOR(i,1,n)
		FOR(j,0,L)
			FOR(k,0,L)
			if (marc[i][j][k].fi+marc[i][j][k].se||marc[i-1][j][k].fi+marc[i-1][j][k].se)
			{
				if (marc[i-1][j][k].se+marc[i-1][j][k].fi)
					marc[i][j][k]=mp(0,0);
				q=min(j+1,L);
				if (marc[i][j][k].fi+marc[i][j][k].se+a[i]<=x&&q!=j&&(marc[i][j][k].fi+marc[i][j][k].se+a[i]<marc[i][q][k].fi+marc[i][q][k].se||marc[i][q][k].fi+marc[i][q][k].se==0))
					marc[i][q][k]=mp(marc[i][j][k].fi+a[i],marc[i][j][k].se);
				q=min(k+1,L);
				if (marc[i][j][k].fi+marc[i][j][k].se+b[i]<=x&&q!=k&&(marc[i][j][k].fi+marc[i][j][k].se+b[i]<marc[i][j][q].fi+marc[i][j][q].se||marc[i][j][q].fi+marc[i][j][q].se==0))
					marc[i][j][q]=mp(marc[i][j][k].fi,marc[i][j][k].se+b[i]);
				if (marc[i][j][k].fi+marc[i][j][k].se==0)
					marc[i][j][k]=mp(inf,inf);
			}
	if (marc[n][L][L].fi+marc[n][L][L].se)
		return 1;
	return 0;

}
void afis(int x,int y,int z)
{
	if (x==0)
		return ;
	if (marc[x][y][z]==mp(inf,inf))
	{
		afis(x-1,y,z);
		fprintf(out,"0 0\n");
		return;
	}
	afis(x-1,y-marc[x][y][z].fi/a[x],z-marc[x][y][z].se/b[x]);
	fprintf(out,"%d %d\n",marc[x][y][z].fi/a[x],marc[x][y][z].se/b[x]);
}
int main()
{
	int i,rez=0;
	in=fopen("lapte.in","r");
	out=fopen("lapte.out","w");
	fscanf(in,"%d%d",&n,&L);
	FOR(i,1,n)
	{
		fscanf(in,"%d%d",&a[i],&b[i]);
	}
	for(i=1<<8;i;i>>=1)
	{
		rez+=i;
		if (ver(rez))
			rez-=i;
	}
	rez++;
	ver(rez);
	fprintf(out,"%d\n",rez);
	afis(n,L,L);
	fclose(in);
	fclose(out);
	return 0;
}