Cod sursa(job #466753)

Utilizator MKLOLDragos Ristache MKLOL Data 27 iunie 2010 14:15:18
Problema Prod Scor 10
Compilator cpp Status done
Runda Stelele Informaticii 2010, clasele X-XII, Ziua 1 Marime 2.47 kb
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<time.h>
using namespace std;

#define Nmax 15
#define Cmax 1010

struct big
{
    int l[2010];
} B[5],maxim,C,nui,maxa,maxb;
int v[15],l[2010],N,S,a;
double y=0;
void afis(big nr1)
{
    for(int i=nr1.l[0];i>=1;--i)
        printf("%d",nr1.l[i]);
    printf("\n");
}
void inmu(big a,big b,big &c)
{
    int T=0;
    c.l[0]=a.l[0]+b.l[0]-1;
    for(int i=1;i<=a.l[0];++i)
        for(int j=1;j<=b.l[0];++j)
        {
            c.l[i+j-1]+=a.l[i]*b.l[j];
        }
        for(int i=1;i<=c.l[0];++i)
        {
            T=(c.l[i]+=T)/10;
            c.l[i]%=10;
        }
        if(T) c.l[++c.l[0]]=T;
}
int compara(big a,big b)
{
    if(b.l[0]>a.l[0])
        {
        return 1;
        }
    if(b.l[0]<a.l[0])
        {

        return -1;

        }
    for(int i=a.l[0];i>=1;--i)
        {
            if(a.l[i]>b.l[i])
               {
                 return -1;
               }
            if(b.l[i]>a.l[i])
            {

            return 1;

            }

        }
        return 0;
}
int make_magic(int k)
{
    for(int i=1;i<=k;++i)
        B[1].l[i]=l[i];
        B[1].l[0]=k;
    for(int i=k+1;i<=N;++i)
        B[2].l[i-k]=l[i];
        B[2].l[0]=N-k;
    sort(B[2].l+1,B[2].l+N-k);
    sort(B[1].l+1,B[1].l+k);
   // afis(B[1]);
   // afis(B[2]);
    C=nui;
    inmu(B[2],B[1],C);
    if(compara(maxim,C)==1)
    {
        maxim=C;
        maxa=B[1];
        maxb=B[2];
    //printf("\n");
    }
    //afis(C);

}
int make()
{   int nri=0;
    for(int i=1;i<=N;i+=2)
        B[1].l[++nri]=l[i];
        B[1].l[0]=nri;
    nri=0;
    for(int i=2;i<=N;i+=2)
        B[2].l[++nri]=l[i];
        B[2].l[0]=nri;
    sort(B[2].l+1,B[2].l+nri+1);
    sort(B[1].l+1,B[1].l+nri+1);
   // afis(B[1]);
   // afis(B[2]);
    C=nui;
    inmu(B[2],B[1],C);
    if(compara(maxim,C)>0)
    {
        maxim=C;
        maxa=B[1];
        maxb=B[2];
    }
   // afis(C);

}
int main()
{
freopen("prod.in","r",stdin);
freopen("prod.out","w",stdout);
double x=clock();
    for(int i=1;i<=9;++i)
        {
        scanf("%d",&v[i]);
        for(;v[i];--v[i])
            {
            l[++a]=i;
            }
        }
    N=a;
    int j=1;
    while(y-x<=75.17)
    {
    y=clock();
      if(j!=1)
      random_shuffle(l+1,l+N+1);
        ++j;


    make();
    }
    afis(maxim);
    //afis(maxa);
    //afis(maxb);


}