Cod sursa(job #196379)

Utilizator gcosminGheorghe Cosmin gcosmin Data 26 iunie 2008 10:25:07
Problema Aliens Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <stdio.h>
#include <map>
using namespace std;

#define MP make_pair
#define ff first
#define ss second

#define NMAX 1010

int N;

int nr[4];

map <pair<int, int>, int> ant;
map <pair<int, int>, int> cur;

int get_nr(int x, int p)
{
	int rez = 0;

	while (x % p == 0) {
		rez++;
		x /= p;
	}

	return rez;
}

int main()
{
	int i, a, b, c;

	freopen("aliens.in", "r", stdin);
//	freopen("aliens.out", "w", stdout);

	scanf("%d", &N);

	ant[MP(0, 0)] = 0;
	cur[MP(0, 0)] = 0;

	map <pair<int, int>, int> :: iterator it, it1;

	N = 50;
	for (i = 1; i <= N; i++) {
		//scanf("%d %d", &a, &b);
		nr[0] = rand() % 20 - 10; nr[1] = rand() % 20 - 10; nr[2] = rand() % 20 - 10;
//		nr[0] = get_nr(a, 2) - get_nr(b, 2);
//		nr[1] = get_nr(a, 3) - get_nr(b, 3);
//		nr[2] = get_nr(a, 5) - get_nr(b, 5);

		for (it = ant.begin(); it != ant.end(); ++it) {
			a = it->ff.ff; b = it->ff.ss; c = it->ss;

			a += nr[1]; b += nr[2]; c += nr[0];

			if ((it1 = cur.find(MP(a, b))) == cur.end()) cur[MP(a, b)] = c;
			else if (c > it1->ss) cur[MP(a, b)] = c;
		}

		ant = cur;

		for (it = ant.begin(); it != ant.end(); ++it) {
			a = it->ff.ff; b = it->ff.ss; c = it->ss;

			if (a + 20 * (N - i) < 0 || b + 20 * (N - i) < 0 || c + 20 * (N - i) < 0) cur.erase(MP(a, b));
		}

		ant = cur;
	}

	for (it = ant.begin(); it != ant.end(); ++it) {
		a = it->ss; b = it->ff.ff; c = it->ff.ss;
//		printf("%d %d %d\n", a, b, c);
	}

return 0;
}