Cod sursa(job #1778730)

Utilizator GabiTulbaGabi Tulba-Lecu GabiTulba Data 14 octombrie 2016 00:12:58
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define INF 2000000000
#define MaxN 105
using namespace std;
    
FILE *IN,*OUT;

int N,L,T,OX,OY,otx,oty;
struct _DP
{
	bool val;
	int Father,A,B;
}Mat[MaxN][MaxN];
struct _Person
{
	int A,B;
}v[MaxN],O[MaxN];
bool GetMax(int Time)
{
	bool found=false;
	memset(Mat,0,sizeof Mat);
	Mat[0][0].val=true;
	for(int k=1;k<=N;k++)
	{
		for(int i=L;i>=0;i--)
			for(int j=L;j>=0;j--)
				if(Mat[i][j].val)
				{
					int X,Y;
					X=Time/v[k].A+1;
					while(X>0)
					{
						X--;
						Y=(Time-X*v[k].A)/v[k].B;
						if(!Mat[i+X][j+Y].val)Mat[i+X][j+Y].val=true,Mat[i+X][j+Y].Father=k,Mat[i+X][j+Y].A=X,Mat[i+X][j+Y].B=Y;
						if(i+X>=L&&j+Y>=L&&!found)
						{
							OX=i+X,OY=j+Y,found=true;
						}
					}
				}
	}
	return found;
}
int main()
{
	IN=fopen("lapte.in","r");
	OUT=fopen("lapte.out","w");
	
	fscanf(IN,"%d%d",&N,&L);
	for(int i=1;i<=N;i++)
		fscanf(IN,"%d%d",&v[i].A,&v[i].B);
	int lw=1,hi=100,mid,T;
	while(lw<=hi)
	{
		mid=(lw+hi)>>1;
		if(GetMax(mid))
		{
			T=mid;
			hi=mid-1;
		}
		else lw=mid+1;
	}
	fprintf(OUT,"%d\n",T);
	for(int i=1;i<=N;i++)
		fprintf(OUT,"%d %d\n",O[i].A,O[i].B);
	return 0;
}