Cod sursa(job #238623)

Utilizator alexandru92alexandru alexandru92 Data 2 ianuarie 2009 19:43:02
Problema Economie Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include<stdio.h>
#define InFile "economie.in"
#define OutFile "economie.out"
#define Nmax 50001
int n;
long v[Nmax],r[Nmax],s;
FILE *fout=freopen(OutFile,"w",stdout);
int Divide(int p,int q)
  {long x=v[p];
   int st=p,dr=q;
   while(st<dr)
        {
         while(st<dr&&v[dr]>=x) dr--;
         v[st]=v[dr];
         while(st<dr&&v[st]<=x) st++;
         v[dr]=v[st];
        }
   v[st]=x;
   return st;
  }
void Qsort(int p,int q)
   {
    int m=Divide(p,q);
    if(m-1>p) Qsort(p,m-1);
    if(m+1<q) Qsort(m+1,q);
   }
int cauta(int prim,int ultim,long x)
   {
    if(prim>ultim) return 0;
    int m=(prim+ultim)/2;
    if(r[m]==x) return 1;
    if(x>r[m]) return cauta(prim,m-1,x);
    return cauta(m+1,ultim,x);
   }
void out()
   {
    int i,l=0,j,ok;
    for(i=1;i<=n;i++)
       if(v[i])
         {r[++l]=v[i]; s+=v[i];
          for(j=i+1;j<=n;j++)
             if(v[j])
               {
                if(v[j]%v[i]==0) v[j]=0;
                if(s==v[j]) v[j]=0;
                if(s>v[j])
                  {ok=cauta(1,l,s-v[j]);
                   if(ok) v[j]=0;
                  }
               }
          v[i]=0;
         }
    printf("%d\n",l);
    for(i=1;i<=l;i++) printf("%ld\n",r[i]);
   }
int main()
   {
    FILE *fin=freopen(InFile,"r",stdin);
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%ld",&v[i]);
    Qsort(1,n);
    if(v[1]==1) printf("1\n1");
      else out();
    fclose(fin); fclose(fout);
    return 0;
   }