Cod sursa(job #18986)

Utilizator butyGeorge Butnaru buty Data 18 februarie 2007 16:20:36
Problema Ghiozdan Scor 64
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include<stdio.h>
const int Gmax=75001,Nmax=20001;
int V[Gmax];
int M[Gmax],P[Gmax],A[Nmax],W[Gmax],GG;
int C[500000],D[500000],E[500000],nc,ne,nd;
int N,G,S;
void cit()
{
	int i;
	freopen("ghiozdan.in","r",stdin);
	scanf("%d%d",&N,&G);
	for(i=1;i<=N;i++)
	{
		scanf("%d",&A[i]);
		S+=A[i];
	}
	if(S<G)
		G=S;
}
void rez()
{
	int i,j,k;
	
	V[0]=1;
    nc=nd=ne=0;
	C[++nc]=0;
    E[++ne]=0;
	for(i=1;i<=N;i++)
	{
		for(j=1;j<=ne;j++)
			C[j]=E[j];
        nc=ne;
        nd=0;
        for(j=1;j<=nc;j++)
			if( C[j]+A[i]<=G && ( V[C[j]+A[i]]==0
            || ( V[C[j]+A[i]] && M[C[j]+A[i]]>M[C[j]]+1) ) )
			{
				V[C[j]+A[i]]=1;
				P[C[j]+A[i]]=M[C[j]]+1;
                W[C[j]+A[i]]=C[j];
				D[++nd]=C[j]+A[i];
			}
		
		ne=0;
		j=1;
		k=1;
		while( j<=nc && k<=nd )
			if(C[j]<D[k])
			{
				E[++ne]=C[j++];
				GG=E[ne];
			}
			else if(C[j]>D[k])
			{
                M[D[k]]=P[D[k]];
                E[++ne]=D[k++];
   				GG=E[ne];
			}
            else if(C[j]==D[k])
            {
                j++;
                M[D[k]]=P[D[k]];
                E[++ne]=D[k++];
   				GG=E[ne];
            }
        while(j<=nc)
        {
        	E[++ne]=C[j++];
            GG=E[ne];
        }
        while(k<=nd)
        {
            M[D[k]]=P[D[k]];
            E[++ne]=D[k++];
            GG=E[ne];
        }
	}
}
void rec(int x,int i)
{
    if(x>0||i<=M[GG])
    {
        printf("%d\n",x-W[x]);
        rec(W[x],i+1);
    }
}
void scr()
{
    freopen("ghiozdan.out","w",stdout);
    printf("%d %d\n",GG,M[GG]);
    rec(GG,1);
    fclose(stdout);
}
int main()
{
	cit();
	rez();
	scr();
	return 0;
}