Cod sursa(job #19855)

Utilizator darklordHabalau Andrei darklord Data 20 februarie 2007 08:38:23
Problema Ghiozdan Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>
#define dim 100


int a[20001],n,i,j,b[75201],k,t[75201],c[20001];
long g,s,max;

void quick(int ls,int ld);
int imp(int ls,int ld);

int main ()
{	freopen ("ghiozdan.in","r",stdin);
	freopen ("ghiozdan.out","w",stdout);
	scanf("%d%ld",&n,&g);
	for(i=1;i<=n;++i)
		scanf("%d",&a[i]);
	quick(1,n);
	max=0;
	b[0]=1;
	for(i=1;i<=n;++i)
	{   if(max+a[i]<=g)
		{
			b[max+a[i]]=1;
			t[max+a[i]]=max;
			max+=a[i];
		}
		for(j=max-1;j>=0;j--)
		{	if(b[j]==1&&b[j+a[i]]==0)
			{	b[j+a[i]]=1;
				t[j+a[i]]=j;
				if(j+a[i]>max&&j+a[i]<=g)
					max=j+a[i];
			}
		}

	}
	for(i=g;;i--)
	{	if(b[i]==1)
		{   for(j=i;j>0;)
			{   s+=j-t[j];
				c[++k]=j-t[j];
				j-=(j-t[j]);
			}
			break;
		}
	}
	printf("%ld %d\n",s,k);
	for(i=1;i<=k;++i)
		printf("%d\n",c[i]);
	return 0;
}
void quick(int ls,int ld)
{   int mij=imp(ls,ld);
	if(mij-1>ls)
		quick(ls,mij-1);
	if(ld>mij+1)
		quick(mij+1,ld);
}
int imp(int ls,int ld)
{	int ii=0,jj=-1;
	while(ls<ld)
	{   if(a[ls]<a[ld])
		{	a[ls]^=a[ld]^=a[ls]^=a[ld];
			ii^=jj^=ii^=jj;
			ii*=-1;
			jj*=-1;
		}
		ls+=ii;
		ld+=jj;
	}
	return ls;
}