こんにちは, Shinoryoです.
今回はC++入門 AtCoder Programming Guide for beginners(APG4b)を, Pythonで無理やり解いてみた結果を書き連ねていこうと思います.
C++入門 AtCoder Programming Guide for beginners (APG4b) - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
EX19 - 九九の採点
前提として, 「Pythonでは関数への引数は全て参照渡しされます」が, 「変数の型によって, 関数内で受けた変更が関数外で保存されるかどうかが変わります」.
- mutable型:関数内で受けた変更が関数外で保存される型. list, set ,dict等.
- immutable型:関数内で受けた変更が関数外で保存されない型. int, float, str, tuple等.
この問題では, 関数内で受けた変更が関数外で保存されるmutable型を使うことによって, 記述することを考えます. 問題文でのプログラムと異なり, int型の変数「correct_count」「wrong_count」をまとめてリストにすることによって, プログラムを完成させることができます.
def saiten(a, correct_wrong_count): | |
for i in range(9): | |
for j in range(9): | |
if a[i][j] != (i+1)*(j+1): | |
a[i][j] = (i+1)*(j+1) | |
correct_wrong_count[1] += 1 | |
else: | |
correct_wrong_count[0] += 1 | |
a = [[int(x) for x in input().split()] for _ in range(9)] | |
correct_wrong_count = [0, 0] | |
saiten(a, correct_wrong_count) | |
for i in range(9): | |
for j in range(9): | |
if j < 8: | |
print(a[i][j], end=" ") | |
else: | |
print(a[i][j]) | |
print(correct_wrong_count[0]) | |
print(correct_wrong_count[1]) |
EX20 - 報告書の枚数
問題にあるプログラムをPythonで書き直すと以下のようになるでしょうか.
def count_report_num(children, x): | |
# プログラムをここに書く | |
n = int(input()) | |
# 各組織の親組織を示す配列 0番組織の親組織は存在しないので-1を入れておく | |
p = [-1] + [int(x) for x in input().split()] | |
# 組織の関係から2次元配列を作る | |
children = [[] for _ in range(n)] # ある組織の子組織の番号一覧 | |
for i in range(1,n): | |
children[p[i]] += [i] # parentの子組織一覧にi番を追加 | |
#各組織について, 答えを出力 | |
for i in range(n): | |
print(count_report_num(children, i)) |
「count_report_num(children, x)」は, 組織番号xの子組織一覧children[x]をもとに, 提出する報告書の枚数を計算する関数です.
- 組織番号xの子組織が存在しない場合, その組織が提出する報告書は, 1枚となる.
- 組織番号xの子組織が存在する場合, その組織が提出する報告書は, それらの子組織が提出する報告書の合計+1枚(その組織自体の分)となる.
再帰関数を利用して報告書の枚数を求めます.
def count_report_num(children, x): | |
if len(children[x]) == 0: | |
return 1 | |
sum = 0 | |
for j in children[x]: | |
sum += count_report_num(children, j) | |
sum += 1 | |
return sum | |
n = int(input()) | |
# 各組織の親組織を示す配列 0番組織の親組織は存在しないので-1を入れておく | |
p = [-1] + [int(x) for x in input().split()] | |
# 組織の関係から2次元配列を作る | |
children = [[] for _ in range(n)] # ある組織の子組織の番号一覧 | |
for i in range(1,n): | |
children[p[i]] += [i] # parentの子組織一覧にi番を追加 | |
#各組織について, 答えを出力 | |
for i in range(n): | |
print(count_report_num(children, i)) |
EX21 - 計算量の見積もり
問題にあるプログラムをPythonで書き直すと以下のようになるでしょうか.
def f0(n): | |
return 1 | |
def f1(n,m): | |
s = 0 | |
for i in range(n): | |
s += 1 | |
for i in range(m): | |
s += 1 | |
return s | |
def f2(n): | |
s = 0 | |
for i in range(n): | |
t = n | |
cnt = 0 | |
while(t > 0): | |
cnt += 1 | |
t /= 2 | |
s += cnt | |
return s | |
def f3(n): | |
s = 0 | |
for i in range(3): | |
for j in range(3): | |
s += 1 | |
return s | |
def f4(n): | |
s = 0 | |
for i in range(n): | |
for j in range(n): | |
s += i+j | |
return s | |
def f5(n,m): | |
s = 0 | |
for i in range(n): | |
for j in range(m): | |
s += i+j | |
return s | |
n,m = [int(x) for x in input().split()] | |
a0 = -1 | |
a1 = -1 | |
a2 = -1 | |
a3 = -1 | |
a4 = -1 | |
a5 = -1 | |
a0 = f0(n) | |
a1 = f1(n,m) | |
a2 = f2(n) | |
a3 = f3(n) | |
a4 = f4(n) | |
a5 = f5(n,m) | |
print("f0:{}".format(a0)) | |
print("f1:{}".format(a1)) | |
print("f2:{}".format(a2)) | |
print("f3:{}".format(a3)) | |
print("f4:{}".format(a4)) | |
print("f5:{}".format(a5)) |
各関数における時間計算量は, 次のように計算されます.
- f0:
( ? あまりよく分かっていないです) - f1:
- f2:
- f3:
- f4:
- f5:
ゆえに, 消すべきは「a4 = f4(n)」になります. しかし, Pythonでは計算が重いからかTLEになってしまいました.
参考にしたサイト等
- rcmdnk様による「Pythonでの引数の取り扱いの罠等」
Pythonでの引数の取り扱いの罠等
Pythonでのリストのコピーとか, 関数に引数を渡す時に 未だにハマる事になるのでその辺のメモ.
関連記事
AtCoder APG4bをPythonで解く(Ex1~5)
こんにちは, Shinoryoです. 今回は C++入門 AtCoder Programming Guide for beginners(APG4b) を, Pythonで無理やり解いてみた結果を書き連ねていこうと思います. C++入門 AtCoder Program...
AtCoder APG4bをPythonで解く(Ex6~10)
こんにちは, Shinoryoです. 今回は C++入門 AtCoder Programming Guide for beginners(APG4b) を, Pythonで無理やり解いてみた結果を書き連ねていこうと思います. C++入門 AtCoder Program...
AtCoder APG4bをPythonで解く(Ex11~15)
こんにちは, Shinoryoです. 今回は C++入門 AtCoder Programming Guide for beginners(APG4b) を, Pythonで無理やり解いてみた結果を書き連ねていこうと思います. C++入門 AtCoder Program...
AtCoder APG4bをPythonで解く(Ex16~18)
こんにちは, Shinoryoです. 今回は C++入門 AtCoder Programming Guide for beginners(APG4b) を, Pythonで無理やり解いてみた結果を書き連ねていこうと思います. C++入門 AtCoder Program...
AtCoder APG4bをPythonで解く(Ex22~24)
こんにちは, Shinoryoです. 今回は C++入門 AtCoder Programming Guide for beginners(APG4b) を, Pythonで無理やり解いてみた結果を書き連ねていこうと思います. C++入門 AtCoder Program...
0 件のコメント:
コメントを投稿 (Please feel free to ask me about your questions! You can use Japanese or English in the comments.)