Cod sursa(job #18326)

Utilizator lucicanuAndrei-Lucian Croitoru lucicanu Data 18 februarie 2007 11:31:13
Problema Ghiozdan Scor 10
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.61 kb
# include <stdio.h>
int n, g, a[20001], da[20001], nu[20001], i, t, gmax;

void swap(int &i, int &j)
{
int t;
t=i;
i=j;
j=t;
}

int part(int l, int r)
{
int p, i, j;
p=a[r];
j=l-1;
for (i=l;i<=r;i++)
   if (a[i]>=p)
     swap(a[++j],a[i]);
return j;
}

void quickS(int l, int r)
{
int poz;
poz=part(l,r);
if (l<poz-1)
  quickS(l,poz-1);
if (r>poz+1)
  quickS(poz+1,r);
}

void afis(int i, int nr, int t)
{
if (i==0)
  {
  printf("%d\n",nr);
  return ;
  }
if (t==1)
  {
  gmax-=a[i];
  if (da[i-1]==gmax)
    afis(i-1,nr+1,1);
  else
    afis(i-1,nr+1,0);
  printf("%d\n",a[i]);
  }
else
  {
  if (da[i-1]==gmax)
    afis(i-1,nr,1);
  else
    afis(i-1,nr,0);
  }
}

int main()
{
freopen("ghiozdan.in","r",stdin);
freopen("ghiozdan.out","w",stdout);
scanf("%d%d",&n,&g);
for (i=1;i<=n;i++)
   scanf("%d",&a[i]);
quickS(1,n);
da[1]=a[1];
nu[1]=0;
for (i=2;i<=n;i++)
   {
   if (da[i-1]+a[i]<=g && ((da[i-1]>nu[i-1] && nu[i-1]+a[i]<=g) || (nu[i-1]+a[i]>g)))
     da[i]=da[i-1]+a[i];
   else
     if (nu[i-1]+a[i]<=g)
       da[i]=nu[i-1]+a[i];
     else
       da[i]=0;
   if (da[i-1]>nu[i-1])
     nu[i]=da[i-1];
   else
     nu[i]=nu[i-1];
   }
if (da[n]>nu[n])
  {
  printf("%d ",da[n]);
  t=1;
  gmax=da[n];
  }
else
  {
  printf("%d ",nu[n]);
  t=0;
  gmax=nu[n];
  }
afis(n,0,t);
/*for (i=n;i>=1;i--)
   if (t==1)
     {
     printf("%d\n",a[i]);
     gmax-=a[i];
     if (da[i-1]==gmax)
       t=1;
     else
       t=0;
     }
   else
     {
     if (da[i-1]==gmax)
       t=1;
     else
       t=0;
     }
*/
return 0;
}