Cod sursa(job #2052356)

Utilizator gruhtenZinnenberg Gruhten gruhten Data 30 octombrie 2017 15:15:41
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <fstream>
#include <cmath>
#define dim 63367
using namespace std;

int a[dim],S[dim],urm[dim],x,nrniv=0,N;
float y;

int main()
{
    ifstream f("suma4.in");
    ofstream g("suma4.out");
    int i,j,n,pozi,pozf,k,A,B,C,D,stop,minim;
    int x,y;
f>>n;
for(i=1;i<=n;++i)f>>a[i];

//x=63367;
x=n;
y=pow(3*x,1.0/3.0);
//g<<y<<'\n';
nrniv=(int)y;
N=(nrniv)*(nrniv+1)*(2*nrniv+1)/6;
if(N>x)
 --nrniv,N=(nrniv)*(nrniv+1)*(2*nrniv+1)/6;;

//partea a 2-a
//vedem ce numere sunt pe ultimul nivel
pozi=N-(nrniv*nrniv)+1;
pozf=N;
for(j=pozi;j<=pozf;++j)
    S[j]=a[j];

j=pozi;
for(i=nrniv-1;i>=1;--i)  //i=nivelul curent
{
    stop=i*i;
    //pe nivelul i sunt i*i elemente
    x=i; //linia
    y=i+1; //coloana
    for(k=1;k<=stop;++k)
    {
        --j;
        //cautam pozitia sa
        --y;
        if(y==0){--x;y=i;}
        //cautam succesorii elementului cu indice j
        A=j + stop + (x-1);
        B=A+1;
        C=A+i+1;
        D=C+1;

        minim=S[A];
        urm[j]=A;
        if(minim>S[B]) minim=S[B],urm[j]=B;
        if(minim>S[C]) minim=S[C],urm[j]=C;
        if(minim>S[D]) minim=S[D],urm[j]=D;
        S[j]=S[urm[j]]+a[j];

        //g<<" j="<<j<<" A="<<A<<" B="<<B<<" C="<<C<<" D="<<D<<" urm[j]="<<urm[j]<<" S[j]="<<S[j]<<'\n';
    }
}

g<<nrniv<<' ';
g<<S[1]<<'\n';
j=1;
while(j!=0)
{
   g<<j<<" ";
   j=urm[j];
}
g<<'\n';

    return 0;
}