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;
}
原文地址:https://www.cnblogs.com/hsuppr/p/3118642.html