🔙
🔝

【paiza問題集 解説】
paizaの森練習問題コンテスト過去問題セット5

3 割打者

3 割打者

    n, m = map(int, input().split())
    
    if m / n >= 0.3:
        print('Yes')
    else:
        print('No')
    

    ヒット数÷打席数=打率 です。

    paiza解答コード例では掛け算で求めていますが、これはコンピュータが小数の扱いが苦手で正しく小数を表現できないことがある為です。『誤差』と言いますが、小数が発生する割り算をすると誤差が生まれたり、小数の計算をすると誤差が生まれたり、とにかくコンピュータで小数を扱うときには誤差に注意、さらに小数を扱うのは避けるべきとも考えられています。利子利息の計算でたとえ1円でもずれたら大変ですよね。ネコはお金に興味が無いから、たとえ1億円ずれて儲かったとしても全く気になりませんけどね。😼

    Python3 は数に強い言語と言われていますが、それは数学モジュール(import mathなど)を使った時の話で、普通に小数を扱うと普通に誤差が生じるのは Python3 も他の言語と同様です。

    ただ、今はこのことを気にしつつも、小数が発生する割り算もどんどん使っていきましょう。加減がわからないと良し悪しも理解できないと思いますし。😊

テレワーク可能か

テレワーク可能か

  • 例1

  • a, b = [[int(i), s] for i, s in [input().split()]][0]
    
    if a > 30 or b == 'rainy':
        print('Yes')
    else:
        print('No')
    
  • 例2

  • a, b = [[int(i), s] for i, s in [input().split()]][0]
    print('Yes' if a > 30 or b == 'rainy' else 'No')
    

    標準入力が面倒なだけで、条件文はシンプルです。条件式は「どちらかが True の時」なので、or で繋げます。

    『30%を超える』なので、a >= 31 ではなく、a > 30 と書きます。この問題では入力が必ず整数となっていると思われますので前者でも正しく判定できますが、小数が扱われる場合は正しく判定されないことがあります。ちなみに入力に小数を扱う問題の場合は、条件の欄に『0.0 ≦ a ≦ 100.0』という書き方がされていたと思います。たしか。

文字列の反転

文字列の反転

    s = input()
    print(s[::-1])
    

    逆順の方法は他にも存在しますが文字列の場合は扱いが面倒になってしまうので、文字列の逆順方法はこれ一択で済ませてしまいます。


    s = paiza
    s[::] の時

    s[0]s[1]s[2]s[3]s[4]
    paiza

    paiza


    s[::-1] の時

    s[-5]s[-4]s[-3]s[-2]s[-1]
    paiza

    aziap

    [::-1]はなぜ0から開始しないのか? (ChatGPT)

CD

CD

    n = int(input())
    CD = 74
    SECOND = 60
    
    total = 0
    for _ in range(n):
        m, s = map(int, input().split())
        
        total += m * SECOND + s
    
    if total <= CD * SECOND:
        print('Yes')
    else:
        print('No')
    

    いろいろな組み方が考えられますが、多いのでその中の1つだけを例に挙げました。

    total は、CDに収めたい曲のそれぞれ 秒数にまとめたものです。1分15秒なら 75秒に変換されて total に加算されます。

    最後に全曲がCDに収まるかどうかを 文で判定します。

サイクルヒット

サイクルヒット

    results = [False for _ in range(4)]
    
    for _ in range(5):
        m = int(input())
        
        if m > 0:
            results[m-1] = True
    
    if all(results):
        print('Yes')
    else:
        print('No')
    

    全てを 1 本以上打った場合』なので、各ヒットを1本打てばよいわけですから、この成績をリストにしてフラグで管理することにします。

    ヒットを打てなかった時は 0 、何かしら打った時は 1 以上なので、作るリストの要素数は4つで、ヒットを打った時、どのヒットを打ったかの判定を m > 0 にします。打ったヒットに割り当てられている 1 〜 4 の番号から 1 を引いてリストの要素番号に紐付けると簡素なプログラムになります。

    ヒット一塁打二塁打三塁打本塁打
    番号 m1234
    [m-1]0123

    そして最後に all() 関数を使って全ての要素が True かどうかを判定します。all() 関数は、リストの要素が全て True の時、True となります。1つでも False が存在するときには False となります。今回の問題にぴったりです。😊

条件を満たす最小の整数

条件を満たす最小の整数

  • 例1

  • x, y, z = map(int, input().split())
    
    while x % y != z:
        x += 1
    
    print(x)
    

    プログラムの解説よりも、プログラムの動作を入力例1 を使って確認してみましょう。

    1
        11 7 2
    
    x, y, z = map(int, input().split())
    
    print(f"{x}: {x%y} {z}")
    while x % y != z:
        x += 1
        print(f"{x}: {x%y} {z}")
    
    11: 4 2
    12: 5 2
    13: 6 2
    14: 0 2
    15: 1 2
    16: 2 2

    要するに x % yz と同じ数値になるまで x を 1 ずつ増やして計算して行くプログラムになっています。

  • てやんでぇめんどくせぇ!(💢`・д・´)

  • 例2

  • x, y, z = map(int, input().split())
    n = (x//y + (x%y!=0)) * y + z
    print(n)
    
  • 例3

  • x, y, z = map(int, input().split())
    n = x + ((z - (x%y) + y) % y)
    print(n)
    

    江戸っ子は寿司食いねぇ!(;´д`) タブンウゴク