書こうと思って忘れていました.48位でした.
No.207 世界のなんとか
問題
回答
#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 王将
問題
回答
(実際通したコード)
(修正版)
(どうでもいいのですが,問題文を読んだ時にとっさに餃子? と思ってしまいました)
よく読むと,このようなことに気が付きます.
- 斜めに移動して,その後ひたすら縦(横)で目標とする座標に到達できる(最短)
- 普通は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