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