Cod sursa(job #1044617)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 30 noiembrie 2013 09:20:36
Problema Pavare2 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <cstring>
using namespace std;
int n, A, B, K[35];
int alb[110][35], negru[110][35], sol[35];

inline void Adunare(int A[], int B[])
{
	int i, t = 0;
	for(i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= 10)
		A[i] = (t += A[i] + B[i]) % 10;
	A[0] = i - 1;
}

inline void Scadere(int A[], int B[])
{
    int i, t = 0;
    for(i = 1; i <= A[0]; ++i)
    {
        if(i <= B[0])
            A[i] = A[i] - B[i] - t;
        else
            A[i] = A[i] - t;
        if(A[i] < 0)
        {
            t = 1;
            A[i] += 10;
        }
        else
            t = 0;
    }
    while(A[0] > 1 && A[A[0]] == 0)
        A[0]--;
}

inline int Compara(int A[], int B[])
{
	if(A[0] < B[0])
		return -1;
	if(A[0] > B[0])
		return 1;
	for(int i = A[0]; i > 0; --i)
	{
		if(A[i] < B[i])
			return -1;
		if(A[i] > B[i])
			return 1;
	}
	return 0;
}

int main()
{
	int i, j, lim, ns, last, nr;
	char s[35];
	ifstream fin("pavare2.in");
	fin >> n >> A >> B;
	fin >> (s + 1);
	fin.close();
	
	ns = strlen(s + 1);
	for(i = 1; i <= ns; ++i)
		K[i] = s[ns - i + 1] - '0';
	K[0] = ns;
	
	alb[n + 1][0] = alb[n + 1][1] = 1;
	negru[n + 1][0] = negru[n + 1][1] = 1;
	for(i = n; i > 0 ; --i)
	{
		lim = min(n, i + A - 1);
		for(j = i; j <= lim; ++j)
			Adunare(alb[i], negru[j + 1]);
		lim = min(n, i + B - 1);
		for(j = i; j <= lim; ++j)
			Adunare(negru[i], alb[j + 1]);
	}
	Adunare(sol, alb[1]);
	Adunare(sol, negru[1]);
	
	ofstream fout("pavare2.out");
	for(i = sol[0]; i > 0; --i)
		fout << sol[i];
	fout << "\n";
	if(Compara(K, alb[1]) <= 0)
	{
		fout << "0";
		last = 0;
		nr = 1;
	}
	else
	{
		Scadere(K, alb[1]);
		fout << "1";
		last = 1;
		nr = 1;
	}
	for(i = 2; i <= n; ++i)
	{
		if(last == 0 && nr == A)
		{
			fout << "1";
			last = 1;
			nr = 1;
			continue;
		}
		if(last == 1 && nr == B)
		{
			fout << "0";
			last = 0;
			nr = 1;
			continue;
		}
		if(Compara(K, alb[i]) <= 0)
		{
			fout << "0";
			if(last == 1)
				nr = 1;
			else
				nr++;
			last = 0;
		}
		else
		{
			Scadere(K, alb[i]);
			fout << "1";
			if(last == 0)
				nr = 1;
			else
				nr++;
			last = 1;
		}
	}
	fout << "\n";
	fout.close();
	return 0;
}