競技プログラミングって取り掛かるための活性化エネルギーみたいなものが睡眠の次ぐらいに低いと思う。時間をどんどん吸われて困る。

A - 帰ってきた器物損壊!高橋君

書くだけ。brainfuck向きの問題だった。

,
>,[-]
,+[-
    [>+>+<<-]
    <[>+>-<<-]
    >[<+>-]
    >[>.<[-]]
    >[-]
    <<,+
]

B - 迷子のCDケース

素直にsimulateすればよい。

#!/usr/bin/env python3
n, m = map(int,input().split())
a = list(range(n+1))
b = list(range(n+1))
for i in range(m):
    disk = int(input())
    a[0], a[b[disk]] = disk, a[0]
    for i in [0, b[disk]]: b[a[i]] = i
for i in range(1,n+1):
    print(a[i])

C - 節約生活

$N \le 10$なので、$O(N2^N)$で全て試せばよい。 見る範囲を短く取りすぎないように注意。2週目まで必要。

1WA生やした。oxxoを2でなく3と出力させてしまっていた。

#include <iostream>
#include <deque>
#include <cassert>
#define repeat_from(i,m,n) for (int i = (m); (i) < (n); ++(i))
#define repeat(i,n) repeat_from(i,0,n)
using namespace std;
int main() {
    string c; cin >> c;
    int n = c.length();
    assert (n <= 10);
    int result = n;
    repeat (s, 1<<n) {
        int popcnt = __builtin_popcount(s);
        if (popcnt < result) {
            deque<bool> a(3*n-1);
            repeat (i,2*n) if (s & (1<<(i%n))) {
                repeat (j,n) if (c[j] == 'o') {
                    a[i+j] = true;
                }
            }
            int l = 0;
            repeat (i,3*n-1) {
                if (a[i]) {
                    ++ l;
                    if (n <= l) result = popcnt;
                } else {
                    l = 0;
                }
            }
        }
    }
    cout << result << endl;
    return 0;
}