第一次做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; }