Cod sursa(job #2167216)

Utilizator alex02Grigore Alexandru alex02 Data 13 martie 2018 20:39:01
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define MAX 1099511627776

using namespace std;

long long matr[60][60],matr_sim[60][60],n;

bool verifica_ultimul_rand()
{
    for(long long i=1; i<=n; i++)
        if(matr_sim[n][i]-matr[n][i]<0)
            return false;
    return true;
}

bool simulare(long long val)
{
    memset(matr_sim,0,sizeof(matr_sim));
    matr_sim[1][1]=val;
    for(long long i=1; i<=n; i++)
    {
        for(long long j=1; j<=i; j++)
        {
            matr_sim[i+1][j]+=(matr_sim[i][j]-matr[i][j]+1)/2;
            matr_sim[i+1][j+1]+=(matr_sim[i][j]-matr[i][j])/2;
        }
    }
    return verifica_ultimul_rand();
}
long long caut_bin()
{
    long long st=1,dr=MAX,mij,poz=-1;
    while(dr>=st)
    {
        mij=(dr+st)/2;
        if(simulare(mij))
        {
            dr=mij-1;
            poz=mij;
        }
        else
        {
            st=mij+1;
        }
    }
    return poz;
}

int main()
{
    ifstream f("pic.in");
    ofstream g("pic.out");
    int v;
    f>>v>>n;
    if(v==1)
    {
        long long suma=0,suma_max=0,rand;;
        for(long long i=1; i<=n; i++)
        {
            suma=0;
            for(long long j=1; j<=i; j++)
            {
                f>>matr[i][j];
                suma+=matr[i][j];
            }
            if(suma>suma_max)
            {
                rand=i;
                suma_max=suma;
            }
        }
        g<<rand;
    }
    else
    {
        long long suma=0;
        for(long long i=1; i<=n; i++)
        {
            for(long long j=1; j<=i; j++)
            {
                f>>matr[i][j];
                suma+=matr[i][j];
            }
        }
        long long rez=caut_bin();
        g<<rez<<" "<<rez-suma<<'\n';
    }
    return 0;
}