ABC337
概要
A - Scoreboard
考えてたこと
特になし、全部足すだけ。
提出したもの
int main() {
int n;
cin >> n;
int takahashi = 0;
int aoki = 0;
rep(i, 0, n) {
int a, b;
cin >> a >> b;
takahashi += a;
aoki += b;
}
if (takahashi > aoki) {
cout << "Takahashi" << endl;
} else if (takahashi < aoki) {
cout << "Aoki" << endl;
} else {
cout << "Draw" << endl;
}
return 0;
}
振り返り
特になし。
B - Extended ABC
考えてたこと
先頭からABC順番に消して行って文字列が残ったらYes, Noとかにする...?って考えたけど、最近お仕事で使ったから正規表現使ってみることにしたらすごく簡単だった。
提出したもの
int main() {
string s;
cin >> s;
if (regex_match(s, regex("A*B*C*"))) {
cout << "Yes" << endl;
} else {
cout << "No" << endl;
}
return 0;
}
振り返り
お仕事で偶然勉強したことがこういうところで活かせると少し嬉しくなります。
C - Count xxx
考えてたこと
全然解けなくて解説を見てもよくわからなかったのでyoutubeの公式解説動画まで見てやっと理解できました。
n番目の人がA[i]の後ろで...みたいに難しく考えて自分の首を絞めていました。
解説を見ながら真似して書いたのが以下。
提出したもの
int main() {
int n;
cin >> n;
vector<int> vec(n);
map<int, int> map;
for (int i = 0; i < n; i++) {
cin >> vec[i];
}
// map[a]=bの時、aの後ろにbが並んでいる
for (int i = 0; i < n; i++) {
map[vec[i]] = i + 1;
}
int start;
for (int i = 0; i < n; i++) {
if (vec[i] == -1) {
start = i + 1;
}
}
int cnt = 0;
while (cnt < n) {
cout << start << " ";
start = map[start];
}
cout << start << endl;
}
振り返り
自分で解いてた時でもmap[a]=b(bの後ろにaがいる)、みたいな連想配列自体を作れていたのでなぜそれを逆にできなかったのか...。落ち着いたら解けたかも、反省です。
D - Cheating Gomoku Narabe
考えてたこと
これは実力不足で解けなかったかなぁと思いました。ただ累積和使う問題自体は以前も解いたことがあるので数をこなして慣れたいです。解説を見ながら書いたコードが以下。
提出したもの
int main() {
int h, w, k;
cin >> h >> w >> k;
int x[200001], d[200001];
char glid[h][w];
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
cin >> glid[i][j];
}
}
int ans = 1e9;
for (int i = 0; i < h; i++) {
for (int j = 0; j < w; j++) {
x[j + 1] = x[j];
d[j + 1] = d[j];
if (glid[i][j] == 'x')
x[j + 1]++;
if (glid[i][j] == '.')
d[j + 1]++;
}
for (int i = 0; i < w - k + 1; i++) {
if (x[i + k] - x[i] == 0) {
ans = min(ans, d[i + k] - d[i]);
}
}
}
for (int i = 0; i < w; i++) {
for (int j = 0; j < h; j++) {
x[j + 1] = x[j];
d[j + 1] = d[j];
if (glid[j][i] == 'x')
x[j + 1]++;
if (glid[j][i] == '.')
d[j + 1]++;
}
for (int i = 0; i < h - k + 1; i++) {
if (x[i + k] - x[i] == 0) {
ans = min(ans, d[i + k] - d[i]);
}
}
}
if (ans > k)
ans = -1;
cout << ans << endl;
return 0;
}
振り返り
解説にある通り、いきなり全部考えるんじゃなくてまずは一行の時にどのように求めるか、みたいに落ち着いて課題を分解すれば良かったかもです、学び。
感想
C問題までは安定して解きたいって思ってるからまた解けなくてちょっとショック。
落ち着いて解くことと数をこなして問題自体に慣れていきたいです。