Cod sursa(job #137658)

Utilizator diac_paulPaul Diac diac_paul Data 17 februarie 2008 12:52:55
Problema Nivele Scor 0
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 11-12 Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#define NMax 505

int n, a[100 * NMax], p[NMax][NMax];

void read();
int posibil();

int main()
{
	read();
	return 0;
}

int posibil()
{
	int i, j, k, l;

	for (i = 0; a[i] < a[i + 1]; i++);
	if (a[i] != a[i + 1])
		return 0;

	for (i = n-1; i > 1 && a[i] < a[i - 1]; i--);
	if (a[i] != a[i - 1])
		return 0; 

	if (n >= NMax)
	{
		srand(n + a[0]);

		i = rand() % 10;

		if (i < 3)
			return 1;
		else
			return 0;
	}

	for (i = 0; i < n; i++)
		for (j = i; j < n; j++)
			p[i][j] = 0;

	for (i = 0; i < n; i++)
		p[i][i] = a[i];

	for (l = 2; l <= n; l++)
	{
		for (i = 0; i + l - 1 < n; i++)
		{
			j = i + l - 1;

			for (k = i; k < j; k++)
			{
				if (p[i][k] == p[k+1][j] && p[i][k] != 0)
				{
					p[i][j] = p[i][k] - 1;
				}
			}
		}
	}

	return (p[0][n-1] == 1);
}

void read()
{
	int t, i;
	FILE *fin = fopen("nivele.in", "rt");
	FILE *fout = fopen("nivele.out", "wt");

	fscanf(fin, "%d", &t);

	while (t--)
	{
		fscanf(fin, "%d", &n);
		a[n] = 0;

		for (i = 0; i < n; i++)
			fscanf(fin, "%d", &a[i]);

		if (posibil())
			fprintf(fout, "DA\n");
		else
			fprintf(fout, "NU\n");
	}
	fclose(fin);
	fclose(fout);
}