A – ringring
1 2 |
a,b,c = map(int, input().split()) print(a+b+c-max(a,b,c)) |
3つの数字の合計値から最大値を引くことで解けました。
初めは下に書いているように、リストに格納し、昇順にソートしてから1,2番目の要素を足し算しようしていました。
ただ、一部どうしても正解にならないサンプルがあり、原因がわからなかったので解説を見てしまいました。
1 2 3 4 5 6 7 |
a,b,c = input().split() list = [] list.append(a) list.append(b) list.append(c) list = sorted(list) print(int(list[0])+int(list[1]),list) |
C – pushpush
方針
・最初に数列Aが与えられているので、解答用の数列をキューを用いて作成。
(deque:デックと読むらしいです。)
・解答用の数列作成の際、操作が奇数回なら先頭、偶数回なら末尾にAの要素を追加。
・解答の出力時、n(Aの要素数)が奇数個ならそのまま、偶数個なら逆順に並べ替えてから出力。
解答
コード+コメント
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
from collections import deque n = int(input()) A = list(map(int,input().split())) #キューを作成 ans_deque = deque() #操作が奇数回\偶数回を判定する変数 count = 1 #リストAから数列を作成 for i in range(len(A)): #偶数回目の操作なら if count%2==0: #左側の先頭に追加 ans_deque.append(A[i]) #奇数回目の操作なら else: #末尾に追加 ans_deque.appendleft(A[i]) #操作回数に1を加える count+=1 #解答用の数列を作成 ans_list = [] #Aの要素の数が奇数なら if len(A)%2!=0: #キューをリストに変換 ans_list = list(ans_deque) #半角区切りで出力 print(*ans_list,sep=" ") #Aの要素の数が奇数なら else: #キューを逆順に並べ替え ans_deque.reverse() #キューをリストに変換 ans_list = list(ans_deque) #半角区切りで出力 print(*ans_list,sep=" ") |
コードのみ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
from collections import deque n = int(input()) A = list(map(int,input().split())) ans_deque = deque() count = 1 for i in range(len(A)): if count%2==0: ans_deque.append(A[i]) else: ans_deque.appendleft(A[i]) count+=1 ans_list = [] if len(A)%2!=0: ans_list = list(ans_deque) print(*ans_list,sep=" ") else: ans_deque.reverse() ans_list = list(ans_deque) print(*ans_list,sep=" ") |
参考
毎回逆順に並べ替えを行った場合、計算量がO(n**2)となるためTLEと解説にありました。
Pythonのリストでソートを行ったときの計算回数が気になったので読み直してみました。
Pythonistaなら知らないと恥ずかしい計算量のはなし – Qiita
dequeについてです。先頭と末尾の要素を操作する場合はO(1)となり、リストよりも高速です。
Pythonのデータが「deque」の使い方 – Qiita
その他
他の問題の解説記事一覧です。
【Python】AtCoder Beginner Contest 解答・解説記事一覧 | Best Practice (find-best-practice.com)
コメント