Cod sursa(job #360747)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 1 noiembrie 2009 21:25:15
Problema NextSeq Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 10000

int n, m, p;
int contor;

int A[MAXN + 1];
int B[MAXN + 1];
int X[MAXN + 1];
int T[MAXN + 1];

int compare (const void * a, const void * b)
{
	return ( *(int*)a - *(int*)b );
}

void citeste()
{
	FILE* fi = fopen("nextseq.in", "r");
	int i, aux;

	//citim n, m, p
	fscanf(fi, "%d%d%d", &n, &m, &p);
	
	//citesc elementele multimii X
	for(i = 0; i < n; ++i) fscanf(fi, "%d", &X[i]);
	qsort(X, n, sizeof(int), compare);
	
	//transform elementele lui X in cifre in baza n
	for(i = 0; i < n; ++i) T[X[i]] = i + 1;

	//citesc elementele multimii A, transformandu-le in echivalentul in baza n
	for(i = 0; i < m; ++i)
	{
		fscanf(fi, "%d", &aux);
		A[m - i - 1] = T[aux];
	}

	//citesc elementele multimii B, transformandu-le in echivalentul in baza n
	for(i = 0; i < p; ++i)
	{
		fscanf(fi, "%d", &aux);
		B[p - i - 1] = T[aux];
	}
	
	fclose(fi);
}

int verifica()
{
	if(m < p) return 0;
	for(int i = 0; i < m; ++i)
		if(A[i] != B[i]) 
			return 0;
	return 1;
}

void plus()
{
	int poz = 0;
	while(A[poz] == n)
		A[poz++] = 1;
	
	if(A[poz] == 0)
		m++;
	A[poz]++;
	
}

void rezolva()
{
	while(!verifica())
	{
		contor++;
		plus();
	}
	contor--;
}

void scrie()
{
	FILE* fo = fopen("nextseq.out", "w");
	fprintf(fo, "%d\n", contor);
	fclose(fo);
}

int main()
{
	citeste();
	rezolva();
	scrie();
	return 0;
}