ABC279参加記

4完32分 1317位

A問題

文字列の $S$ に含まれる (vの数) $+$ (wの数) $\times 2$を求める。

import std;

void main() {
    string S;
    readf("%s\n", S);

    ulong res = S.count('v') + S.count('w') * 2;
    res.writeln;
}

B問題

文字列$S$に$T$が含まれるかどうか。

import std;

void main() {
    string S, T;
    readf("%s\n%s\n", S, T);

    writeln(S.canFind(T) ? "Yes" : "No");
}

C問題

$S$を90度回転した図形を$U$、$T$を90度回転した図形を$V$とする。 $U$と$V$をそれぞれソートして2つの図形が一致する場合、$S$の列を並び替えて$T$と等しくできる。

import std;

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

    auto S = new string[](H), T = new string[](H);
    foreach (i; 0 .. H) readf("%s\n", S[i]);
    foreach (i; 0 .. H) readf("%s\n", T[i]);

    auto U = new dchar[][](W, H), V = new dchar[][](W, H);
    foreach (i; 0 .. H) {
        foreach (j; 0 .. W) {
            U[j][i] = S[i][j];
            V[j][i] = T[i][j];
        }
    }

    U.sort, V.sort;

    writeln(U == V ? "Yes" : "No");
}

D問題

三分探索を用いて、高橋くんが地面に到達できる最も早い時刻を求める。

import std;

void main() {
    long A, B;
    readf("%d %d\n", A, B);

    real a = A.to!real, b = B.to!real;

    real f(long x) {
        real g = x.to!real;
        return b * g + a / sqrt(g+1);
    }

    long l, r = A;
    while (r - l > 2) {
        long u = l + (r - l) / 3, v = r - (r - l) / 3;

        if (f(u) < f(v)) r = v;
        else l = u;
    }

    real res = min(f(l), f(l+1), f(r));
    writefln("%.10f", res);
}