Cod sursa(job #18375)

Utilizator yo_myhMihut Bogdan-Adrian yo_myh Data 18 februarie 2007 11:48:17
Problema Ghiozdan Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.32 kb
#include<fstream.h>
long N,w,A[75100],P[75100],nr[210],nr2[210];
int GR,G[20100];
long i,j,m,q;

void init(long k)
{
long i;
for(i=1;i<=200;i++)
	A[i]=-1;
for(i=201;i<=k+1;i++)
	A[i]=0;
for(i=0;i<=200;i++)
	nr[i]=nr2[i];
for(i=1;i<=k+1;i++)
	P[i]=0;
}

long caut(long k)
{
long j,i;
for(i=201;i>0;i--)
	if(nr[i]>0)
		{
		for(j=75000;j>=0;j--)
			if(A[j]!=-1)
				if ((A[j]+1<A[j+i] && A[j+i]!=-1) || (A[j+i]==-1))
					{
					A[j+i]=A[j]+1;
					P[j+i]=i;
					}
		nr[i]--;
		if(nr[i]==0)
			nr[i]=-1;
		i++;
		}

for(i=k;i>0;i--)
	if(A[i]>0)
		return P[i];
return 0;
}


int main()
{
ifstream f("ghiozdan.in");
ofstream gout("ghiozdan.out");

f>>N;
f>>GR;

for(i=1;i<=N;i++)
	{
	f>>G[i];
	nr[G[i]]++;
	nr2[G[i]]=nr[G[i]];
	}
f.close();



A[0]=0;
for (i=1;i<=200;i++)
	A[i]=-1;


for(i=201;i>0;i--)
	if(nr[i]>0)
		{
		for(j=75000;j>=0;j--)
			if(A[j]!=-1)
				if ((A[j]+1<A[j+i] && A[j+i]!=-1) || (A[j+i]==-1))
					{
					A[j+i]=A[j]+1;
					P[j+i]=i;
					}
		nr[i]--;
		if(nr[i]==0)
			nr[i]=-1;
		i++;
		}

for(i=GR;i>=0;i--)
	if(A[i]!=-1)
		{
		gout<<i<<" "<<A[i]<<"\n";
		break;
		}

gout<<P[i]<<" ";
w=A[i]-1;
q=i-P[i];
nr2[P[i]]--;

for(j=1;j<=w;j++)
	{
	init(q);
	m=caut(q);
	nr2[m]--;
	q-=m;
	gout<<m<<" ";
	}

gout.close();
return 0;
}