Beispiel #1
0
INT solve(INT n, INT k, INT a, INT b, INT c, INT r) {
		
		VECT* m = new VECT();
		MAP* used = new MAP();

		gen(a, b, c, r, k, m, used);

		VECT* unused = new VECT();
		for (INT x = 0; x < 2*k; ++x) {
				if (used->find(x) == used->end()) {
						unused->push_back(x);
				}
		}

		m->push_back((*unused)[0]);
		(*used)[(*unused)[0]] = 1;
		unused->pop_front();

		INT last = m->size() - 1;
		INT limit = 2 * k;
		INT currval;

		printf("limit = %lu\n", limit);

		while (last != 2 * k) {
				if (last % 100 == 0) {
						printf("%d %lu\n", m->size(), last);
						
				}
						
				currval = (*m)[0];

				if (unused->size() == 0) {
						printf("Big bad error (n=%lu, k=%lu)\n", n, k);
						return 0;
				}

				if (used->find(currval) == used->end()) {
						(*used)[currval] = 0;
				}
				
				if ((*used)[currval] == 0) {
						if (currval < (*unused)[0]) {
								m->push_back(currval);
								(*used)[currval] = 1;
						} else {
								m->push_back((*unused)[0]);
								(*used)[(*unused)[0]] = 1;
								unused->pop_front();
								unused->push_back(currval);
								sort(unused->begin(), unused->end());
						}
				} else if ((*used)[currval] > 1) {
						(*used)[currval] -= 1;
						m->push_back((*unused)[0]);
						unused->pop_front();
				} else if ((*used)[currval] == 1) {
						if (currval < (*unused)[0]) {
								m->push_back(currval);
						} else {
								(*used)[currval] = 0;
								m->push_back((*unused)[0]);
								(*used)[(*unused)[0]] = 1;
								unused->pop_front();
								unused->push_back(currval);
								sort(unused->begin(), unused->end());
								/*
								x = (*unused)[unused->size() - 1];
								while (true) {
										if (used->find(x) == used->end()) {
												unused->push_back(x);
												break;
										}
										++x;
								}// */		
						}
				}

				m->pop_front();
				++last;
		}
		printf("Done...\n");

		printf("m->size() = %lu\n", (INT)m->size()); 
		return m->back();
}