Cod sursa(job #1010948)

Utilizator nod_softwareBudisteanu Ionut Alexandru nod_software Data 15 octombrie 2013 22:27:43
Problema Subsir crescator maximal Scor 60
Compilator c Status done
Runda Arhiva educationala Marime 3.83 kb
#include <stdio.h>
#include <stdlib.h>

const _iMaxLength = 100001;

struct TProblemData
{
    int iValue, iMaxLength;

    struct TProblemData *pPreviousElement;
};

typedef struct TProblemData TProblemData;

//--------------------------------------------------
int ReadData(TProblemData * vDataArray, int * iLength)
{
    FILE * fIn = fopen("scmax.in","r");

    fscanf(fIn,"%d",iLength);

    int i;
    for (i=0; i<*iLength; i++)
    {
        fscanf(fIn,"%d",&vDataArray[i].iValue);
        vDataArray[i].iMaxLength=0;
        vDataArray[i].pPreviousElement=NULL;
    }

    fclose(fIn);
}
//--------------------------------------------------
int binary_search2(int * vData, int iIndexLeft, int iIndexRight, int iValue)
{
    if (iIndexLeft==iIndexRight)
    {
        if (vData[iIndexLeft]==iValue)
            return iIndexLeft;
        else
            return iIndexRight;

    } else
    {
        if (iValue<=vData[(iIndexLeft+iIndexRight) / 2])
            return binary_search2(vData,iIndexLeft,((iIndexLeft+iIndexRight) / 2),iValue);
        else
            return binary_search2(vData,((iIndexLeft+iIndexRight) / 2)+1,iIndexRight,iValue);
    }
}
//--------------------------------------------------
int ComputeLIS(TProblemData * vLISData, int iLength)
{
    int i,iSize=1;
    int vTempData[_iMaxLength];
    TProblemData * vpTempDataPrevious[_iMaxLength];

    vTempData[0]=vLISData[0].iValue;
    vLISData[0].iMaxLength=1;
    vpTempDataPrevious[0]=&vLISData[0];

    for (i=1; i<iLength; i++)
    {
        if (vLISData[i].iValue<vTempData[0])
        {
            vTempData[0]=vLISData[i].iValue;
            vpTempDataPrevious[0]=&vLISData[i];
            vLISData[i].iMaxLength=1;
            vLISData[i].pPreviousElement=NULL;//Primul element din sir
        } else
        if (vLISData[i].iValue > vTempData[iSize-1])
        {
            vTempData[iSize]=vLISData[i].iValue;
            vLISData[i].iMaxLength=iSize+1;
            vLISData[i].pPreviousElement=vpTempDataPrevious[iSize-1];//referinta, pt reconstituire
            vpTempDataPrevious[iSize]=&vLISData[i];//referinta, pt reconstituire
            iSize++;
        } else
        {
           int iPos = binary_search2(vTempData,0,iSize-1,vLISData[i].iValue);
           vTempData[iPos] = vLISData[i].iValue;
           vLISData[i].iMaxLength = iPos+1;
           vLISData[i].pPreviousElement=vpTempDataPrevious[iPos]->pPreviousElement;//referinta, pt reconstituire
           vpTempDataPrevious[iPos]=&vLISData[i];//referinta, pt reconstituire
        }
    }
    return 1;
}
//--------------------------------------------------
void PrintSolution(TProblemData * vLISData, int iLength)
{
    int i;
    TProblemData * pCurrentElement = &vLISData[0];

    for (i=0; i<iLength; i++)
        if (pCurrentElement->iMaxLength<vLISData[i].iMaxLength)
           pCurrentElement=&vLISData[i];

    FILE * fOut = fopen("scmax.out","w");

/*
    for (i=0; i<iLength; i++)
        fprintf(fOut,"%d ",vLISData[i].iValue);
    fprintf(fOut,"\n");
    for (i=0; i<iLength; i++)
        fprintf(fOut,"%d ",vLISData[i].iMaxLength);
    fprintf(fOut,"\n");*/

    fprintf(fOut,"%d\n",pCurrentElement->iMaxLength);

    int vTempData[_iMaxLength]; i=-1;

    while (pCurrentElement!=NULL)
    {
        //fprintf(fOut,"%d ",pCurrentElement->iValue);
        i++;
        vTempData[i]=pCurrentElement->iValue;
        pCurrentElement=pCurrentElement->pPreviousElement;
    }
    while (i!=-1)
        fprintf(fOut,"%d ",vTempData[i]), i--;

    fclose(fOut);
}
//--------------------------------------------------
int main()
{
    int iLength;
    TProblemData vLISArray[_iMaxLength];

    ReadData(vLISArray,&iLength);

    ComputeLIS(vLISArray,iLength);

    PrintSolution(vLISArray,iLength);

    return 0;
}