🔙
🔝

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

最大値と最小値

最大値と最小値

    nums = [int(input()) for _ in range(3)]
    print(max(nums))
    print(min(nums))
    
神経衰弱

神経衰弱

    cards = map(int, input().split())
    cards_count = [0] * 13
    
    for card in cards:
        cards_count[card-1] += 1
    
    if all(cnt % 2 == 0 for cnt in cards_count):
        print('Yes')
    else:
        print('No')
    

    ランクD相当と言いながら、割と難易度高いと思います。😓

じゃんけん (忖度)

じゃんけん (忖度)

    y, h = input().split()
    hands = {'R': 'S', 'S': 'P', 'P': 'R'}
    
    if int(y) < 10:
        print(hands[h])
    else:
        print(hands[hands[h]])
    

    辞書で作成するジャンケンの手を、

    {相手の手: 負けてあげる手}

    とすることで、「入力 h → 負けの手を出す」となります。10歳未満の子に対する流れです。


    一方、10歳以上に対しては絶対に負けてやらない!ので必ず勝つ手を出しますが、この必ず負けてあげる辞書をそのまま使って実現できます。

    相手が 'R' を出したらこちらは 'P' を出して勝ちます。グーの負ける手の負ける手がグーの勝つ手となります。

    【相手がグーの時】
    {'R': 'S'} → {'S': 'P'} → パーで勝つ

    負ける手の負ける手を出して勝つのが、

    print(hands[hands[h]])
    

    この部分になります。

    【相手がチョキの時】
    {'S': 'P'} → {'P': 'R'} → グーで勝つ

    【相手がパーの時】
    {'P': 'R'} → {'R': 'S'} → チョキで勝つ


    そしてパーの負ける手はグーであいこになり、三すくみが一周します。

n→10 進法

n→10 進法

  • 例1

  • n = int(input())
    a = input()
    
    result = 0
    for i, b in enumerate(a[::-1]):
        result += pow(n, i) * int(b)
    
    print(result)
    
  • 例2

  • n = int(input())
    a = input()
    print(int(a, n))
    

    例2のとおり、int() 関数を使うと簡単に求められます。

    int() 関数 (Pythonリファレンス)

    10進数は、重み × 各位の数 を全て足すことで求められます。

    重みn3n2n1n0

    2進数

    8421
    1010
    8020

    8 + 0 + 2 + 0 = 10


    4進数

    641641
    1010
    64040

    64 + 0 + 4 + 0 = 68


    4進数

    641641
    1230
    6432120

    64 + 32 + 12 + 0 = 108


    10進数

    1000100101
    1234
    1000200304

    1000 + 200 + 30 + 4 = 1234

    一桁目から計算していますので、入力値を逆順にしてから計算しています。

お菓子の価格帯

お菓子の価格帯

  • 例1

  • _ = int(input())
    a = list(map(int, input().split()))
    q = int(input())
    
    for _ in range(q):
        l, r = list(map(int, input().split()))
    
        cnt = 0
        for kind in a:
            if l <= kind <= r:
                cnt += 1
            
        print(cnt)
    
  • 例2

  • _ = int(input())
    a = list(map(int, input().split()))
    q = int(input())
    
    for _ in range(q):
        l, r = list(map(int, input().split()))
        print(sum(l <= kind <= r for kind in a))
    
  • 例3

  • _ = int(input())
    a = list(map(int, input().split()))
    q = int(input())
    lr = [list(map(int, input().split())) for _ in range(q)]
    
    print(*(sum(l <= kind <= r for kind in a) for l, r in lr), sep='\n')
    

    初め、「個数」と言うから買えるだけ買うのかと思いましたが、「お菓子の種類数」という意味で安心しました。😓

    与えられたクエリに基づいて線形探索をするだけですが、二重ループを使います。クエリはパイザ君が求める価格帯 l, r なので、この中央にお菓子の価格を当てて評価にかけていきます。

    この a_i の値はとくに昇順となっているわけではないようです。 breakcontinue を使って効率を求めようとすると不正解になります。←やった

ぴったり卵を生産 - その 2

ぴったり卵を生産 - その 2

    ネコ、ちょっとわからないので勉強してきます。😸