水面下の夢

競プロやイラストに興味があります.メインブログがここ.同人サークル「かのらぶ」のページはこっち( https://yumechi0525.amebaownd.com ).ブログアイコンはYaQ(@8_9_00)さんから.

yukicoder no.207/208/209/210 に参加しました(解いたのは207, 208のみです)

書こうと思って忘れていました.48位でした.




No.207 世界のなんとか

問題

No.207 世界のなんとか - yukicoder

回答

#27069 No.207 世界のなんとか - yukicoder

(今の中高生は分かるんですかね…)
3の倍数 or 3がつく数の時は出力を行います.
「3で割った時のあまりが0」または「数値を文字列を変換した時に3が含まれている」という条件で簡単に出力可能です.(文字列に変換しなくても10で割り続けて,10の剰余が3であるかどうかチェックすることで確認可能だとは思います,私はループを増やすと疲れるので避けましたけど.)

A, B = map(int, input().split())
for i in range(A, B + 1):
    if i % 3 == 0 or str(i).find("3") != -1:
        print(i)

追記

"3" in str(i)

で良さそうですね…w

NO.208 王将

問題

No.208 王将 - yukicoder

回答

(実際通したコード)

#27259 No.208 王将 - yukicoder

(修正版)

#27633 No.208 王将 - yukicoder

(どうでもいいのですが,問題文を読んだ時にとっさに餃子? と思ってしまいました)


よく読むと,このようなことに気が付きます.

  • 斜めに移動して,その後ひたすら縦(横)で目標とする座標に到達できる(最短)
    • 普通は2通りあるので,もし片方のルート上に歩兵がいれば,もう片方のルートを選択する,このイメージで良い
    • 移動量はmax(x, y)
  • 例外として,x == yの際は斜め移動が1ルートしかない,このルート上に歩兵がいる場合,避けなければならない.
    • つまり,x == y and x2 == y2 and x2 < x のとき,移動量はmax(x, y) + 1

この,歩兵が邪魔なときの移動ですが,例えば,(x, y) = (2, 2), (x2, y2) = (1, 1) を考えた際に,このような動きになります.
□…移動可能マス
G…ゴール(今は(2, 2))
歩…歩兵(今は(1, 1))
王…王将(スタートは(0, 0))

# 0回目(初期状態)
□□G
□歩□
王□□

# 1回目
□□G
□歩□
□王□

# 2回目
□□G
□歩王
□□□

# 3回目
□□王(G)
□歩□
□□□

という形で動きますので,max(2, 2) + 1で,3回… となります.

以上を踏まえまして,修正版のコードはこんなかんじになりました.

x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())
res = max(x1, y1)

if x1 == y1 and x2 == y2 and x2 < x1:
    res += 1
print(int(res))

ちなみになぜ最初の提出版のコードから修正したかといいますと…
0 <= x,y,x2,y2 <= 10^9 を読み落としていて,負の領域のことまで考えていたからですorz
一応,どの象限であっても目標点が直線上,かつ歩兵が直線上にあり,目標点よりも手前に歩兵があるパターンで考えれば良いのですが^^;
一応貼っておきます,正の数以外のテストが通るかどうかは知りません(試すのめんどくさくなった)

import math

x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())
diff = math.fabs(x1 - y1)
clac = lambda x, y: min(math.fabs(x), math.fabs(y))
res = diff + clac(x1, y1)

if diff == 0:
    if math.fabs(x2) == math.fabs(y2):
        if 0 < x2 < x1 and 0 < y2 < y1:
            res += 1
        elif 0 < x2 < x1 and y1 < y2 < 0:
            res += 1
        elif x1 < x2 < 0 and 0 < y2 < y1:
            res += 1
        elif x1 < x2 < 0 and y1 < y2 < 0:
            res += 1

print(int(res))


三問目はなんとなーく…? わかったような…?
時間があれば試してみたいとは思いますが…

追記

今気がついたけど,過去に書いたブログ記事が解説としてリンクされてたのです…
もう少し立派に見えるように書きなおしておこう…ww