LoginSignup
1
0

More than 1 year has passed since last update.

ABC207 A~C問題 ものすごく丁寧でわかりやすい解説 python 灰色~茶色コーダー向け #AtCoder

Last updated at Posted at 2021-09-23

ABC207(AtCoder Beginner Contest 207) A~C問題の解説記事です。
灰色~茶色コーダーの方向けに解説しています。

その他のABC解説、動画などは以下です。

A - Repression

考えられる和の値は
A+B
B+C
C+A
の3種類です。

このうち一番大きいものを出力すればよいです。
一番大きいものはmaxを使って確認できます。

入力の受け取り、出力がわからない方は以下の記事を参考にしてください。

【提出】

# 入力の受け取り
A,B,C=map(int, input().split())

# A+B,B+C,C+Aのうち、一番大きいものを出力
print(max(A+B,B+C,C+A))

B - Hydrate

操作回数をxとして不等式を立てると以下のようになります。

A+Bx≤CDx

変形して

A≤(CD-B)x

となります。
制約は1≤A≤10^5、つまりAはプラスなので(CD-B)が0以下の時、目標達成不可能です。

そうでない場合はさらに変形し、

A/(CD-B)≤x

つまりA/(CD-B)の切り上げが答えです。

切り上げはmathのceilという関数を使えます。
まずimport mathと書き、math.ceil(x)でxの切り上げを計算できます。

【提出】

# 入力の受け取り
A,B,C,D=map(int, input().split())

# mathのインポート
import math

# (C*D-B)が0以下の場合
if (C*D-B)<=0:
    # -1を出力
    print(-1)

# そうでない場合((C*D-B)がプラスの場合)
else:
    # (A/(C*D-B)を切り上げ
    ans=math.ceil((A/(C*D-B)))
    # 答えの出力
    print(ans)

C - Many Segments

開区間と閉区間が混在すると扱いが面倒です。
入力は全て整数なので開区間は左端なら+0.1,右端なら-0.1して閉区間にしてしまいましょう。

「例」
(1,5)→[1+0.1,5-0.1]→[1.1,4.9]

2つの区間について共通部分を持つか?は一方の右端または左端が他方の区間内にあるか確認すればOKです。

「例」
区間i[1.1,5]と区間j[2.1,6.9]について
(区間iの左端)≤(区間jの左端)≤(区間iの右端)
1.1≤2.1≤5
となっているから共通区間を持つ。

すなわち以下の4つのうち一つでも成り立てば共通区間を持ちます。
(区間iの左端)≤(区間jの左端)≤(区間iの右端)
(区間iの左端)≤(区間jの右端)≤(区間iの右端)
(区間jの左端)≤(区間iの左端)≤(区間jの右端)
(区間jの左端)≤(区間iの右端)≤(区間jの右端)

(i,j)全ての組について処理を行うときは以下のように二重ループを書きます。

for i in range(N):
    for j in range(i+1,N):

こうすると(i,j)について
(1,2)
(1,3)
...
(1,N-1)
(2,3)
(2,4)
...
(N-2,N-1)
と、うまいこと全パターンの網羅ができます。

【提出】

# 入力の受け取り
N=int(input())

# 区間の格納リスト
section=[]

# N回
for i in range(N):
    # 入力の受け取り
    t,l,r=map(int, input().split())
    # t=1の場合
    if t==1:
        # 区間[l,r]を追加
        section.append([l,r])
    # t=2の場合
    elif t==2:
        # 区間[l,r-0.1]を追加
        section.append([l,r-0.1])
    # t=3の場合
    elif t==3:
        # 区間[l+0.1,r]を追加
        section.append([l+0.1,r])
    # t=4の場合
    elif t==4:
        # 区間[l+0.1,r-0.1]を追加
        section.append([l+0.1,r-0.1])

# 答えの格納用変数
ans=0

# i=1~Nまで
for i in range(N):
    # j=i+1~Nまで
    for j in range(i+1,N):
        # 区間iの左端,右端
        i_l,i_r=section[i]
        # 区間jの左端,右端
        j_l,j_r=section[j]

        # (区間iの左端)≤(区間jの左端)≤(区間iの右端)
        if i_l<=j_l<=i_r:
            # 答えにカウント
            ans+=1
        # (区間iの左端)≤(区間jの右端)≤(区間iの右端)
        elif i_l<=j_r<=i_r:
            # 答えにカウント
            ans+=1        
        # (区間jの左端)≤(区間iの左端)≤(区間jの右端)
        elif j_l<=i_l<=j_r:
            # 答えにカウント
            ans+=1        
        # (区間jの左端)≤(区間iの右端)≤(区間jの右端)
        elif j_l<=i_r<=j_r:
            # 答えにカウント
            ans+=1

# 答えの出力
print(ans)

【広告】

『AtCoder 凡人が『緑』になるための精選50問詳細解説』

AtCoderで緑になるための典型50問をひくほど丁寧に解説した本(kindle)、pdf(booth)を販売しています。
値段:100円(Kindle Unlimited対象)
【kindle】

【booth(pdf)】

1~24問目まではサンプルとして無料公開しています

『AtCoder ABC201~225 ARC119~128 灰・茶・緑問題 超詳細解説』

ABC201~225、ARC119~128灰・茶・緑DIfficulty問題(Dif:0~1199) を解説しています。
とにかく 細かく、丁寧に、具体例を豊富に、実装をわかりやすく、コードにコメントをたくさん入れて 解説しています。

サンプルを5問分公開しています

Qiitaにて無料公開している『ものすごく丁寧でわかりやすい解説』シリーズをベースにしていますが、 【キーワード】【どう考える?】【別解】を追加 し、 【解説】と【実装のコツ】を分ける ことでよりわかりやすく、 具体例や図もより豊富に 書き直しました。
Qiitaには公開していない ARC119~128の灰・茶・緑DIfficulty問題も書き下ろし ています。

値段:300円(Kindle Unlimited対象)
【kindle】

【booth(pdf)】

ARC119~128の部分のみ抜粋した廉価版 もあります。
値段:200円(Kindle Unlimited対象)
【kindle】

【booth(pdf)】

『Excelでリバーシを作ろう!! マクロ、VBAを1から学ぶ』

Excelのマクロ(VBA)で「三目並べ」「マインスイーパー」「リバーシ」を作る解説本です!
マクロ、VBAが全くわからない人でも大丈夫! 丁寧な解説と図でしっかり理解しながら楽しくプログラミングを学ぶ事ができます!
値段:300円(Kindle Unlimited対象)

サンプルとして「準備」~「三目並べ」を無料公開しています。

【kindle】

【booth(pdf】

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0