Cod sursa(job #2841387)

Utilizator Programator060804Ungureanu Vlad Constantin Programator060804 Data 29 ianuarie 2022 17:45:19
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int a[58][58][58], s[58][58][58], n, m;

ofstream out ("scmax.out");

int niveluri(int n)
{
    int i = 1;
    while(n)
    {
        n-=i*i;
        ++i;
    }
    return i - 1;
}

void citire()
{
    ifstream in ("scmax.in");
    in >> n;
    m = niveluri(n);
    out << m << " ";
    for(int i=1; i<=m; i++)
        for(int j=1; j<=i; j++)
            for(int k=1; k<=i; k++)
            {
                in >> a[i][j][k];
                if(i == m)
                    s[i][j][k] = a[i][j][k];
            }
    in.close();
}

void sol()
{
    struct
    {
        int i,j,k,ko;
    } pozm, poza;
    for(int i=m-1; i>=1; i--)
        for(int j=1; j<=i; j++)
            for(int k=1; k<=i; k++)
                s[i][j][k] = a[i][j][k] + min(s[i+1][j][k], min(s[i+1][j+1][k], min (s[i+1][j+1][k+1], s[i+1][j][k+1])));
    out << s[1][1][1] << endl;
    pozm.i = 1, pozm.j = 1, pozm.k = 1;
    int ko = 1, mini;
    out << ko << " ";
    for(int i=2; i<=m; i++)
    {
        mini = INT_MAX;
        for(int j=1; j<=i; j++)
            for(int k=1; k<=i; k++)
            {
                ++ko;
                if(mini > s[i][j][k] && pozm.i + 1 == i && (pozm.j == j || pozm.j + 1 == j) && (pozm.k == k || pozm.k == k-1))
                {
                    poza.i = i, poza.j = j, poza.k = k, poza.ko = ko;
                    mini = s[i][j][k];
                }
            }
        pozm.i = poza.i, pozm.j = poza.j, pozm.k = poza.k;
        out << poza.ko << " ";
    }
}

void afisare()
{
    out.close();
}

int main()
{
    citire();
    sol();
    afisare();
    return 0;
}