競プロに出てきそうな問題つくった

第1問

あなたは今、お気に入りの猫カフェにいます。

そこには看板猫の 「しろ」「もも」「くろ」 の3匹がいます。

店員さんから「今日は合計で K 粒 のカリカリ(おやつ)を彼らにあげてください」と、

一袋のカリカリを渡されました。

3匹へのカリカリの配り方は、全部で何通りあるでしょうか?

ただし、猫たちの健康のために以下のルールを守らなければなりません。

【ルール】

公平に: 3匹それぞれに、最低でも 1粒 はあげてください。

食べすぎ注意: 1匹にあげられる上限は N粒 までです。

第2問

お店には以下の2つの棚があります。

  • 赤い棚 N種類の美容液があり、価格はリスト P = [P_1, P_2, ・・・, P_N] です。
  • 青い棚 N種類のクリームがあり、価格はリスト Q = [Q_1, Q_2, ・・・,Q_N] です。

ここから美容液を1つ、クリームを1つ選んで合計金額をちょうど K円にする組み合わせは存在しますか?

存在する場合は「Yes」、存在しない場合は「No」と出力してください。

第3問

あなたは、1番からN番までの番号がついたNこの書類が入った棚を管理しています。

最初は、棚の左から順に1,2,3・・・,Nと並んでいます。

管理を楽にするために、以下の3種類の指示を効率よく処理するためのプログラムを考えてください。

【操作のルール】

①入れ替え(1,x,y)

棚の左からx番目にある書類を、新しい書類「番号y」に差し替える。

②ラベル貼り(2)

棚の前面にあるラベルを書き換える。

「正順」なら「逆順」にする。「逆順」なら「正順」にする。

(※実際に中の書類を並べ替えてはいけません。時間がかかりすぎるからです!)

③取り出し(3,x)

棚の左からx番目にある書類を指定し、その書類の番号を答える。

—入力例————————————

入力値:

5 4
1 4 8
3 2
2
3 2

書類の数(5)とクエリの実行回数(4)

操作順入力操作内容状態・解説出力
11 4 8更新: 左から4番目を 8 に変更配列: [0, 1, 2, 3, 8, 5]
23 2取得: 左から2番目の値を確認正順のため A[2] を参照2
32反転: ラベルを「逆順」に変更State を反転
43 2取得: 左から2番目の値を確認逆順のため右から2番目 (A[4]) を参照8

解説

1問目🐈

# N: 1匹あたりの上限粒数, K: カリカリの合計粒数
N,K = map(int,input().split())

#三匹へのカリカリの配り方を探索する
SUM = 0
for shiro in range(1,N+1):#しろの分
    for momo in range(1,N+1):#ももの分
        kuro = K - shiro - momo# くろの分(残りの粒数)

        # くろの分も「1粒以上、かつN粒以下」であればカウント
        if kuro == 1 and kuro <= N: 
            SUM += 1

# 配り方の合計を表示
print(SUM)

2問目💄

# N:商品の種類, K: 予算
N,K = map(int,input().split())

# P:美容液の価格,Q:クリームの価格
P = list(map(int,input().split()))
Q = list(map(int,input().split()))

# 合計金額がK円になる組み合わせがあるか判定するフラグ
found = False
# 全探索
for i in P:
    for j in Q:
        if i+j == K:
            found = True
            break # 見つかった時点で探索を終了
    if found:
        break #外側のループも終了

# 判定結果を出力
if found:
    print("Yes")
else:
    print("No")

3問目📕

# N:書類の数, Q: 操作回数
N,Q = map(int,input().split())

# 各書類のIDを記録したリスト
A = list(range(N+1))

# 操作された状態を表すラベル
State = 1

# 操作を入力
for i in range(Q):
    Query = input().split()

# ①入れ替え(1,x,y)
# 棚の左からx番目にある書類を、新しい書類「番号y」に差し替える。
    if int(Query[0]) == 1:
        x = int(Query[1])
        y = int(Query[2])
        if State == 1:
            A[x] = y
        if State == 2:
            A[N+1-x] = y

# ②ラベル貼り(2)
# 棚の前面にあるラベルを書き換える。
    if int(Query[0]) == 2:
        if State == 1:
            State = 2
        else:
            State = 1

# ③取り出し(3,x)
# 棚の左からx番目にある書類を指定し、その書類の番号を答える。
    if int(Query[0]) == 3:
        x = int(Query[1])
        if State == 1:
            print(A[x])
        if State == 2:
            print(A[N+1-x])
タイトルとURLをコピーしました