Pagini recente » Cod sursa (job #2595876) | Cod sursa (job #2896780) | Cod sursa (job #1115887) | Cod sursa (job #1690475) | Cod sursa (job #18375)
Cod sursa(job #18375)
#include<fstream.h>
long N,w,A[75100],P[75100],nr[210],nr2[210];
int GR,G[20100];
long i,j,m,q;
void init(long k)
{
long i;
for(i=1;i<=200;i++)
A[i]=-1;
for(i=201;i<=k+1;i++)
A[i]=0;
for(i=0;i<=200;i++)
nr[i]=nr2[i];
for(i=1;i<=k+1;i++)
P[i]=0;
}
long caut(long k)
{
long j,i;
for(i=201;i>0;i--)
if(nr[i]>0)
{
for(j=75000;j>=0;j--)
if(A[j]!=-1)
if ((A[j]+1<A[j+i] && A[j+i]!=-1) || (A[j+i]==-1))
{
A[j+i]=A[j]+1;
P[j+i]=i;
}
nr[i]--;
if(nr[i]==0)
nr[i]=-1;
i++;
}
for(i=k;i>0;i--)
if(A[i]>0)
return P[i];
return 0;
}
int main()
{
ifstream f("ghiozdan.in");
ofstream gout("ghiozdan.out");
f>>N;
f>>GR;
for(i=1;i<=N;i++)
{
f>>G[i];
nr[G[i]]++;
nr2[G[i]]=nr[G[i]];
}
f.close();
A[0]=0;
for (i=1;i<=200;i++)
A[i]=-1;
for(i=201;i>0;i--)
if(nr[i]>0)
{
for(j=75000;j>=0;j--)
if(A[j]!=-1)
if ((A[j]+1<A[j+i] && A[j+i]!=-1) || (A[j+i]==-1))
{
A[j+i]=A[j]+1;
P[j+i]=i;
}
nr[i]--;
if(nr[i]==0)
nr[i]=-1;
i++;
}
for(i=GR;i>=0;i--)
if(A[i]!=-1)
{
gout<<i<<" "<<A[i]<<"\n";
break;
}
gout<<P[i]<<" ";
w=A[i]-1;
q=i-P[i];
nr2[P[i]]--;
for(j=1;j<=w;j++)
{
init(q);
m=caut(q);
nr2[m]--;
q-=m;
gout<<m<<" ";
}
gout.close();
return 0;
}