ABC296参加記

4完3ペナ45分 1612位

A問題

group関数を用いて、男女が交互に並んでいるか判定する。

import std;

void main() {
    int N;
    readf("%d\n", N);

    auto S = readln.chomp.to!(dchar[]);

    auto G = S.group.array;
    writeln(G.length == N ? "Yes" : "No");
}

B問題

2重ループを用いて*を探索し、その位置を名前に変換する。

import std;

void main() {
    string res;

    foreach (i; 0 .. 8) {
        string S;
        readf("%s\n", S);

        foreach (j, s; S) {
            if (s == '*') {
                res = to!dchar('a'+j).to!string ~ to!string(8-i);
            }
        }
    }

    res.writeln;
}

C問題

$A_{i} - A_{j} = X$を式変形すると$A_{i} = X + A_{j}$となる。 $A_{i}(1 \leq i \leq N)$を連想配列で管理し、連想配列内に$X + A_{j}(1 \leq j \leq N)$となる値があるか判定する。

import std;

void main() {
    int N, X;
    readf("%d %d\n", N, X);

    auto A = readln.chomp.split.to!(int[]);

    bool[int] list;
    foreach (a; A) {
        list[a] = true;
    }

    bool isOK;
    foreach (a; A) {
        if (X + a in list) {
            isOK = true;
        }
    }

    writeln(isOK ? "Yes" : "No");
}

D問題

$i(1 \leq i \leq 10^{6})$に対して、$M$を$i$で割った切り上げを$d$とする。 $i$と$d$が1以上$N$以下であれば、$X = min(X, i \times d)$で答えを求める。

import std;

enum long S = 2 * 10 ^^ 6;

void main() {
    long N, M;
    readf("%d %d\n", N, M);

    long res = -1;
    foreach (i; 1 .. S+1) {
        if (i > N) break;

        long d = (M + i - 1) / i;
        long m = i * d;
        if (1 <= d && d <= N) {
            if (res == -1) res = m;
            else res = min(res, m);
        }
    }

    res.writeln;
}