TopCoder SRM 581

第一次做TC。。。

只做上了2道题(是我太菜了吗?)

还行ranting一下子就成1500+了。


 

Div2 p1 BlackAndWhiteSolitaire

int BlackAndWhiteSolitaire::minimumTurns(string cardFront) {

	int i, n = cardFront.size(), ret = 0;

	for (i = 0; i < n; ++i)

		if (1 & i)

			ret += cardFront[i] == 'W';

		else

			ret += cardFront[i] == 'B';

	return min(ret, n - ret);

}

 Div2 p2 SurveillanceSystem

涉及到抽屉原理

就是初始让所有方格都设为不可能被看到的。

然后确定可能被看到的,和一定被看到的。(注意没有两个摄像头的覆盖是重叠的。)

我写的比较挫,将就看吧。

int f[55], ff[55], sum[55];

string SurveillanceSystem::getContainerInfo(string containers, vector <int> reports, int L) {

	int i, j, k, n, m, s, ss, mm;

	n = containers.size();

	m = reports.size();

	memset(f, 0, sizeof f);

	sort(reports.begin(), reports.end());

	sum[mm = 0] = 1;

	for (i = 1; i < m; ++i)

		if (reports[i] == reports[mm])

			++sum[mm];

		else {

			reports[++mm] = reports[i];

			sum[mm] = 1;

		}

	++mm;

	for (i = 0; i < mm; ++i) {

		memset(ff, 0, sizeof ff);

		ss = 0;

		for (j = 0; j < n - L + 1; ++j) {

			s = 0;

			for (k = j; k < j + L; ++k)

				if (containers[k] == 'X')

					++s;

			if (s != reports[i])

				continue;

			++ss;

			for (k = j; k < j + L; ++k)

				++ff[k];

		}

		if (ss == sum[i]) {

			for (j = 0; j < n; ++j)

				if (ff[j])

					f[j] = 2;

		} else {

			for (j = 0; j < n; ++j)

				if (ss - ff[j] + 1 <= sum[i])

					f[j] = 2;

				else

					f[j] = max(f[j], (int)(ff[j] > 0));

		}

	}

	string ret = "";

	for (i = 0; i < n; ++i)

		switch (f[i]) {

		case 0:

			ret += "-";

			break;

		case 1:

			ret += '?';

			break;

		case 2:

			ret += '+';

			break;

		}

	return ret;

}

 

你可能感兴趣的:(topcoder)