3. 2023 年 12 月の GESP Python レベル 3 プログラミングの質問
[レベル 3 プログラミングの問題1 ]
[テスト問題名] : 子猫が魚を分ける
【問題の説明】
ビーチにはたくさんの魚がいて、N匹の子猫がそれを分け合うためにやって来ます。最初の子猫は山盛りの魚を N 個の部分に均等に分割し、さらに i<N 個の魚がいたので、子猫は余った i 個の魚を海に投げ込み、その一部を持ち去りました。2番目の子猫が残りの魚を同じ量に分けたところ、さらにi匹の魚が増え、子猫はさらにi匹の魚を海に投げ込み、1匹を持ち去りました。3 番目、4 番目、... 、N 番目の子猫は、残りの魚を N 個に分割し、余分な i 個の魚を捨て、1 個を取り除きます。
毎回、子猫の数と海に投げ込まれる魚の数を入力し、すべての子猫が魚を食べることができるように、海岸にある最小限の魚の数を出力するプログラムを作成します。
例: 2 匹の子猫が魚 N=2 を分け、毎回捨てる魚の数は i=1 です。各子猫が魚を食べるためには、2 番目の子猫が1 匹の魚を奪う必要があり、その後、 3 匹の。最初の子猫には 3*2+1=7 匹の魚が割り当てられます。
[説明を入力]
合計2行。最初の行には整数 N が含まれ、2 行目には整数 i が含まれます。0<N<10; i<N が保証されます。
[出力の説明]
1 行につき 1 つの整数で、要件を満たすビーチの魚の最小数を表します。
【分析】
最後の子猫が x 匹の魚を食べると仮定します (x≥1)。したがって、最後の山の魚の数は x*N+i となり、前の山の数は現在の山の N/(N-1) 倍に i 匹の魚を加えたものになります (Throw離れて私は釣りをします、1 つの部分が取り去られ、N-1 個の部分が残るため)、このように N-1 回押し上げます。各山が整数の場合、それが結果です (ビーチ上の魚の最小数が条件を満たす)要件)、それ以外の場合、x は 1 を増加させてからカウントします。
【完全なコード】
n = int(input()) # 小猫数
i = int(input()) # 每次丢掉的鱼数
x = 1 # 最后一只小猫吃到的鱼数,至少1条
while True:
ans = x * n + i
for j in range(1, n):
if ans % (n - 1): # 也可用ans % (n - 1) != 0
break # ans是上一堆剩下的(n-1)份,不能整除则修改x
ans = ans // (n - 1) * n + i # 求上一堆鱼数,用“/”除会变浮点数
else: # 都能整除(for循环正常结束)
break # 跳出while循环,输出答案
x += 1
print(ans)
【運用結果】
【プログラミングレベル3 質問2】
[試験問題名] : 単位換算
【問題の説明】
今週のシャオ ヤンの数学の宿題は単位変換です。プログラミングが好きなシャオ ヤンは、これらの問題を解決するためにプログラミングをすることにしました。Xiao Yang は長さと重さの単位のみを学びました。具体的には次のとおりです。
- 長さの単位にはキロメートル ( km ) 、メートル ( m ) 、ミリメートル ( mm )があり、それらの関係は 1km=1000m=1000000mm です。
- 重量の単位にはキログラム ( kg ) 、グラム ( g ) 、ミリグラム ( mg )があり、これらの関係は 1kg=1000g=1000000mg です。
Xiao Yang の宿題には、大きい単位を小さい単位に変換することだけが含まれます。つまり、Xiao Yang の宿題には次の質問のみが含まれます: メートルをミリメートルに変換する、キロメートルをミリメートルに変換する、キロメートルをメートルに変換する、グラムをミリグラムに変換する、キログラムをミリグラムに変換する、キログラムからグラムへ。
それでは、単位変換プロセスを完了するのを手伝ってください。
[説明を入力]
入力の最初の行は整数 N で、質問の数を示します。
次の N 行には、各行に、単位変換の問題を示す文字列がx単位1 = ?単位2の形式で含まれています。そのうち、_ _ _ _ _ _ _ _ _ _ 2インチ大きい。
たとえば、質問で 1km を mm に変換する必要がある場合は、「1 km = ? mm」と入力します (各部分はスペースで区切ります) 。
1≤N≤1000を保証します。
[出力の説明]
N 行出力し、すべての質問に対する答えを順番に出力します。出力するときは、入力中の? を答えに置き換えるだけで、残りはそのまま出力されます。Xiao Yang の質問には、大きい単位を小さい単位に変換するだけが含まれており、入力xは整数であるため、答えも整数である必要があります。
たとえば、質問で 1km を mm に変換する必要があり、入力が1 km = ? mmである場合、 1 km = 1000000 mmを出力する必要があります。
【分析】
1文字の単位を基本単位とし、換算率を1000とします。頭文字が「k」の単位の換算率は1,000,000、頭文字が「m」の単位の換算率は1,000,000となります。 」は1です。大きなユニットを小さなユニットに変換する場合、2 つのユニットの変換係数を除算したものが 2 つのユニット間の変換係数となります。
【完全なコード】
n = int(input()) # 输入题目数量
for i in range(n):
unt_con = input() # 输入换算式,形如:20 kg = ? g,每部分用空格隔开
x, unt1, _, _, unt2 = unt_con.split() # 拆分获取x和两个单位
if unt1[-1] == unt2[-1]: # 如果是同类单位
def ratio(unt): #计算单位unt的换算系数
if len(unt) == 1:
return 1000
elif unt[0] == "k":
return 1000000
else:
return 1
y = int(x) * ratio(unt1) // ratio(unt2)
rst = unt_con.replace("?", str(y)) # 将?替换为转换结果
print(rst) # 输出结果
else:
print('不是同类单位无法转换')
【運用結果】
4. 2023 年 12 月の GESP Python レベル 4 プログラミングの質問
[レベル 4 プログラミングの問題1 ]
【プログラミングの質問1】
[テスト問題名]:Xiao Yangの辞書
【問題の説明】
遠く離れた惑星にA国とB国という 2 つの国があります。言語Aと言語Bという異なる言語が使用されています。Xiao Yang はB国の翻訳者です。彼の仕事は、言語Aの記事を言語Bの記事に翻訳することです。
仕事をスムーズに進めるために、Xiao Yang は言語 B の単語に対応する言語 A の単語を記録した辞書を作りました。偶然にも、これらの単語は地球上の 26 個の小文字の英語で構成されています。
Xiao Yang は、この辞書に基づいて A 言語の記事を翻訳するのに役立つプログラムを作成してほしいと考えています。この記事は、句読点 !()-[]{}\|;:'"、./?<> といくつかの A 言語の単語で構成されています。各単語は少なくとも 1 つの句読点で区切られている必要があります。プログラムでは、言語をすべて置換する必要があります。この文章内の単語とその言語 B の翻訳。特に、辞書にない単語が見つかった場合は、大文字の UNK に置き換えてください。
たとえば、Xiao Yang の辞書には A 言語の 2 つの単語 abc と d が含まれており、B 言語の翻訳はそれぞれ a と def であるため、A 言語の記事 abc.ddabc.abcd. を B 言語の記事 a.def. def に翻訳できます。 .a.UNK.、abcd という単語は辞書にないため、UNK に置き換える必要があります。
[説明を入力]
最初の行には、辞書内のエントリの数を表す整数 N が含まれています。N≤100を保証します。
次の N 行には、各行に 1 つのスペースで区切られた 2 つの文字列 A と B が含まれており、それぞれ辞書内のA言語の単語と、それに対応するB言語の翻訳を表します。すべての A が繰り返されないこと、A と B の長さが 10 を超えないことを確認してください。
最後の行は文字列 S で、翻訳する必要があるA言語の記事を表します。文字列 S の長さが 1000 を超えていないことを確認し、文字列 S に小文字と句読点!()-[]{}\|;:'",./?<> のみが含まれていることを確認してください。
[出力の説明]
翻訳結果を表す行を出力します。
【分析】
まず N を押して、N 個のキーと値のペアを含む辞書を作成します。「キー」は言語 A、「値」は言語 B です。翻訳対象の文字列 S には、言語 A を表す小文字と句読点!()-[]{}\|;:'",./?<> のみが含まれているため、2 つの句読点間の単語は単語であるため、句読点記号がある場合、前にあるのは単語なので翻訳する必要があります 句読点はそのまま翻訳する必要はありません 次の単語の抽出に備えて単語はクリアされます 単語が辞書にない場合は、値は「UNK」です。
【完全なコード】
n = int(input()) # 输入字典字条数
dic = {}
for i in range(n):
key, val = input().split() # 用空格拆分A语言与B语言对
dic[key] = val # 建立A语言与B语言的翻译字典
org = input() # 获取待翻译句子,原文
org += '\n' # 添加换行符\n作为结束,\n也作为标点符号
mbc = '' # 译文
wrd = '' # 清空准备接收单词
for i in org:
if i in '''!()-[]{}\|;:'",./?<>\n''': # 如果是标点符号
if wrd != '': # 如果接收单词有内容,则翻译
if wrd in dic: # 单词在字典中
mbc += dic[wrd] # 则译文加入翻译词
else:
mbc += 'UNK' # 否则译文加入“UNK”
wrd='' # 清空准备接收下一个单词
mbc += i # 译文加入标点符号
else:
wrd += i # 如果是字母,则加到单词中
print(mbc) # 输出译文
【運用結果】
【プログラミングレベル4 質問2】
[試験問題名] : 天池競馬
【問題の説明】
Tian Ji とレースをしたいと考えています。それぞれが N 頭の馬を持っており、N ラウンドで競い合い、各ラウンドでそれぞれ 1 頭の馬を送り勝者を決定する必要があります。
あなたの馬の速度はu 1 、u 2 、…、uN、Tian Ji の馬の速度はv 1 、v 2 、…、vNです。Tian Ji は順番に馬を送り出しますが、最も多くのラウンドで勝つためにはどのように馬を配置しますか? 偶然にも、あなたとTian Jiの馬はすべてスピードが異なるため、引き分けは不可能です。
[説明を入力]
最初の行には整数Nが含まれています。1≤N≤5×10 ⁴を保証します。
スペースで区切られたN個の整数の次の行はu 1 、u 2 、…、uNで、馬の速度を表します。1≤ ui ≤2 Nであることが保証されます。
スペースで区切られたN個の整数の次の行はv 1 、v 2 、…、vNで、Tian Ji の馬の速度を表します。1≤ vi ≤2 Nであることが保証されます。
[出力の説明]
勝利できる最大ラウンド数を示す行を出力します。
【分析】
問題は「Tian Ji は順番に馬を出していきますが、ゲームで最も多くのラウンドで勝つために軍隊をどのように配置しますか?」というものですが、この質問では最大何ラウンドで勝つことができる (勝利する) かを答えるだけで済みます。 。したがって、まず自分の馬と Tian Ji の馬を速度順に並べ替え、次に自分の馬と Tian Ji の最も遅い馬を遅いものから速い順に比較します。あなたの馬が Tian Ji の馬に勝つと、Tian Ji はより速い馬に変わります。馬は一度しか出場できません)。
【完全なコード】
n = int(input()) # 每人马匹数
u = [int(i) for i in input().split()] # 你的每匹马的速度值,拆分后用列表表达式转换
v = [int(i) for i in input().split()] # 田忌的每匹马的速度值,拆分后用列表表达式转换
u.sort() # 你的马按速度值排序
v.sort() # 田忌的马按速度值排序
j = 0 # 田忌的马排序后的序号
ans = 0 # 答案初值
for i in range(n): # 你的马排序后的序号,每匹用一次
if u[i] > v[j]: # 如果你选的马的速度快于田忌当前的马
ans += 1 # 你赢一轮
j += 1 # 田忌此马已比赛,不重复,更换下一匹更快的马
# 如果你的马的速度慢于田忌当前的马,你得换下一匹更快的马
print(ans) # 输出结果
【運用結果】
「Tian Ji は馬を順番に送り出しますが、ゲームで最も多くのラウンドで勝つために軍隊をどのように配置しますか?」という質問の意味に厳密に従って答える場合は、元の位置を記録する必要があります。
【完全なコード】
n = int(input()) # 每人马匹数
# 你的马的速度,拆分后用列表表达式转换为序号、速度(整数)元组列表,形如(序号, 速度)
u = [(i,int(j)) for i,j in enumerate(input().split())]
v = [int(i) for i in input().split()] # 田忌的马的速度,拆分后用列表表达式转换为整数
u = sorted(u,key=lambda x:x[1]) # 按你的马的速度(元组第2项)排序,以提高匹配效率
j = 0 # 田忌的马排序后的序号
ans = 0 # 答案
for i in range(n): # 田忌的马按序比赛
for j in u:
if j[1] > v[i]: # 如果你选的马的速度快于田忌当前的马
ans += 1 # 你赢一轮
x[(i,v[i])] = j # 田忌此马已比赛,不重复,更换下一匹更快的马
u.remove(j) # 比过的马删除,防止重复
break
print(ans) # 输出结果
for i in x: # 输出比赛方案
print(f'田忌{i[0]+1}号马(速度{i[1]}),'
f'你用{x[i][0]+1}号马(速度{x[i][1]}),你赢')
【運用結果】