競プロ日和

競技プログラミングを楽しむ

ABC118 D

問題

動的計画法を使う。

dpn配列に文字列の長さ、dp配列に文字列を格納する。配列の長さはマッチ棒の個数。

dpnを0から順番に調べ、初期値(-1)ではなく、追加したマッチ棒の個数の地点の長さが

①追加したい個所と同じ

・追加したい個所に、追加したい個所と新たな文字列のうち、大きいほうを格納

②追加したい個所より長い

・dpnを更新

・追加したい個所に、新たな文字列を格納

最終的にdp[n]が答え。

mi = {"1": 2, "2": 5, "3": 5, "4": 4, "5": 5, "6": 6, "7": 3, "8": 7, "9": 6}
n, m = map(int, input().split())
A = input().split()
dpn = [0] + [-1] * 10010
dp = [""] * 10010
for i in range(n):
    for a in A:
        if dpn[i] != -1:
            cnt = dpn[i] + 1
            if dpn[i + mi[a]] < cnt:
                dpn[i + mi[a]] = cnt
                dp[i + mi[a]] = max(a + dp[i], dp[i] + a)
            elif dpn[i + mi[a]] == cnt:
                dp[i + mi[a]] = max(dp[i + mi[a]], a + dp[i], dp[i] + a)
print(dp[n])

No787

問題

分かりやすいように、AとBを設定。

A:裏切り者でないのに裏切り者だと判定

B:裏切り者に対し、裏切り者と判定

とすると、計算式は以下のようになる。

f:id:kani_panda:20190213221225p:plain

P, Q = map(float, input().split())
print(P * Q * 100 / (P * Q + (100 - P) * (100 - Q)))

No785

問題

分かりやすいように変数を定義

R:赤が表示できる文字数

G:緑が表示できる文字数

B:青が表示できる文字数

上記より、カラーコードのイメージは

#RRGGBB

のようになるので、

「R * R * G * G * B * B」

を出力すればいい。

ans = 1
for s in (input() for _ in range(3)):
    if s == "NONE":
        ans *= 256
    else:
        ans *= (15 - s.count(',')) ** 2
print(ans)