Pagini recente » Cod sursa (job #1924404) | Cod sursa (job #2861383) | Cod sursa (job #1002838) | Cod sursa (job #1803957) | Cod sursa (job #1010957)
#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
vLISData[i].pPreviousElement=vpTempDataPrevious[iPos-1];//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;
}