Pagini recente » Cod sursa (job #2899944) | Cod sursa (job #2788676) | Cod sursa (job #2852887) | Cod sursa (job #642158) | Cod sursa (job #163685)
Cod sursa(job #163685)
#include <stdio.h>
#define NMAX 5010
int /*v[NMAX][4],*/ poz[NMAX][4], hmax[NMAX], sir[NMAX], ival[NMAX];
int i, j, k, cc, vaux, N, M;
void buildSir()
{
for (cc = M; cc >= 1; cc--)
{
i = ival[cc];
if (i == 1)
sir[1] = 1;
else
{
if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3]) // cazul 4
{
// extinde sirul pentru i-2 la sirul pentru i
for (j = i - 1; j >= poz[i][2] + 1; j--)
sir[j] = sir[j - 1];
sir[poz[i][2]] = i - 1;
for (j = i; j >= poz[i][3] + 1; j--)
sir[j] = sir[j - 1];
sir[poz[i][3]] = i;
}
else // cazurile 1, 2, 3
{
// extinde sirul pentru i-1 la sirul pentru i
if (poz[i][1] == poz[i][2] && poz[i][2] == poz[i][3]) // cazul 1
{
for (j = i; j >= poz[i][1] + 1; j--)
sir[j] = sir[j - 1];
sir[poz[i][1]] = i;
}
else
if (poz[i][1] == poz[i][2] && poz[i][2] < poz[i][3]) // cazul 2
{
for (j = i; j >= poz[i][2] + 1; j--)
sir[j] = sir[j - 1];
sir[poz[i][2]] = i;
}
else
if (poz[i][1] < poz[i][2] && poz[i][2] == poz[i][3]) // cazul 3
{
for (j = i; j >= poz[i][2] + 1; j--)
sir[j] = sir[j - 1];
sir[poz[i][2]] = i;
}
}
}
}
}
int main()
{
freopen("sortare.in", "r", stdin);
scanf("%d", &N);
poz[1][1] = poz[1][2] = poz[1][3] = 3;
for (i = 2; i <= N; i++)
scanf("%d %d %d", &poz[i][1], &poz[i][2], &poz[i][3]);
hmax[0] = 0;
/*v[1][1] = v[1][2] = v[1][3] = */hmax[1] = 1;
for (i = 2; i <= N; i++)
{
// sorteaza pozitiile pentru lungimea i
for (j = 1; j < 3; j++)
for (k = j + 1; k <= 3; k++)
if (poz[i][j] > poz[i][k])
{
vaux = poz[i][j];
poz[i][j] = poz[i][k];
poz[i][k] = vaux;
}
if (poz[i][1] == poz[i][2] && poz[i][2] == poz[i][3]) // cazul 1
{
//v[i][1] = v[i][2] = v[i][3] = i;
hmax[i] = hmax[i - 1] + 1;
}
else
if (poz[i][1] == poz[i][2] && poz[i][2] < poz[i][3]) // cazul 2
{
//v[i][1] = v[i][2] = i;
//v[i][3] = 1;
hmax[i] = hmax[i - 1] + 1;
}
else
if (poz[i][1] < poz[i][2] && poz[i][2] == poz[i][3]) // cazul 3
{
//v[i][1] = 1;
//v[i][2] = v[i][3] = i;
hmax[i] = hmax[i - 1] + 1;
}
else
if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3]) // cazul 4
{
//v[i][1] = 1;
//v[i][2] = i - 1;
//v[i][3] = i;
hmax[i] = hmax[i - 2] + 1;
}
}
freopen("sortare.out", "w", stdout);
printf("%d\n", hmax[N]);
// reconstituie sirul
ival[M = 1] = N;
while (ival[M] > 1)
{
i = ival[M];
if (poz[i][1] < poz[i][2] && poz[i][2] < poz[i][3])
{
M++;
ival[M] = i - 2;
}
else
{
M++;
ival[M] = i - 1;
}
}
buildSir();
for (i = 1; i < N; i++)
printf("%d ", sir[i]);
printf("%d\n", sir[N]);
return 0;
}