Cod sursa(job #236539)

Utilizator DraStiKDragos Oprica DraStiK Data 27 decembrie 2008 21:43:48
Problema Economie Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
int a[1005],sol[1005];
int s[50005];
int n,m;
void solve ()
{
	int i,j,k;
	s[0]=1;
	for (i=1; i<=n; ++i)
		if (!s[a[i]])
		{
			sol[++m]=a[i];
			for (j=a[n]+1; j>=0; --j)
				if (s[j])
					s[j+a[i]]=1;
		    for (j=1; j<=a[n]+1; ++j)
				 if (s[j]==1)
					 for (k=2*j; k<=a[n]+1; k+=j)
						 s[k]=2;
        }
    printf ("%d\n",m);
    for (i=1; i<=m; ++i)
        printf ("%d\n",sol[i]);
}
int divide (int p,int q)
{
    int st,dr,x;
    st=p;
    dr=q;
    x=a[p];
    while (st<dr)
    {
        while (st<dr && a[dr]>=x)
            --dr;
        a[st]=a[dr];
        while (st<dr && a[st]<=x)
            ++st;
        a[dr]=a[st];
        a[st]=x;
    }
    return st;
}
void qsort (int p, int q)
{
    int m;
    m=divide (p,q);
    if (m-1>p)
        qsort (p,m-1);
    if (m+1<q)
        qsort (m+1,q);
        
}
int main ()
{
    freopen ("economie.in","r",stdin);
    freopen ("economie.out","w",stdout);    
    int i;
    scanf ("%d",&n);
    for (i=1; i<=n; ++i)
		scanf ("%d",&a[i]);
    qsort (1,n);
    solve ();
    return 0;
}