AtCoder Begginers Selection "Some Sums" と "Card Game for Two"
1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。
これは割と簡単だった。
Nまでの整数を文字列に直して、1文字ずつ再度整数に変換
→条件に合致するかを調べる
理屈的には、上に書いたことで終わってるんだけど、「1文字ずつ整数に変換」をPythonでどうやるのかが分かんなくて、結構苦戦した。
それで調べると、Pythonでは文字列をリスト関数にぶち込むと、その文字列を1文字ずつ要素にしたリストが出来上がるらしい。それで、そのリストから1要素ずつ取り出して再度数値型に変換することで何とかクリアできた。
なんかC言語みたいな感じやなと思った。
それで、提出したコードが次。
# -*- coding: utf-8 -*- # 入力値の取得 n,a,b = map(int, input().split()) # 各桁の数値を格納する変数 placeNums = list() # 各桁の数値の和 sumPLaceNum = 0 # 各桁の数値の和がa以上 b以下の場合の整数のリスト sumNumList = list() # 答え someSum = 0 # 条件に合致する整数を探索 for i in range(n+1): # 変数を初期化 sumPLaceNum = 0 # 整数を文字列型に変換し、それぞれの文字を要素とするリストを作成 placeNums = list(str(i)) #print(placeNums) # 各文字を数値に再変換→合計 for j in range(len(placeNums)): sumPLaceNum += int(placeNums[j]) #条件に合致するときのみ整数をリストに追加 if sumPLaceNum >= a and sumPLaceNum <= b: sumNumList.append(i) # 探索した整数を合計する for k in range(len(sumNumList)): someSum += int(sumNumList[k]) print(someSum)
N枚の整数が書かれたカードがあり、2人がそのカード順番に引いていく。2人ともが、カードの合計が最大になるようにカードを引くとき、先行の合計と、高校の人の合計の差はいくらになるか
これも簡単やった。
「2人ともがカードの合計が最大になるように引く」⇔「カードを昇順に並べて上から順に交互に引いていく」
というだけ。
Pythonだと、リスト型にsort()メソッドというのがあるので、これを適用して、あとはループで交互に用意した変数に足しこんでいく。
これ、Pythonだとメソッドがすでに準備されているから簡単なんだけど、C言語とかC++とかだと、ソートのアルゴリズムも自分で記述しないといけないのかな。だったら難しいなぁ…
提出したコードが次。
# -*- coding: utf-8 -*- # 枚数の取得 n = int(input()) # カードリストの取得 cardList = list(map(int, input().split())) aliceSum = 0 bobSum = 0 # ターンフラグ aliceTurn = True # カードリストをソート cardList.sort() # カードを1枚ずつ交互に引いていく→ソートしてあるので山札の1番上が最大の点数 for i in range(n-1,-1,-1): # アリスのターン if aliceTurn: aliceSum += cardList[i] aliceTurn = False # ボブのターン else : bobSum += cardList[i] aliceTurn = True print(aliceSum - bobSum)
この3連休のうち、後半の2日は、AtCoderに登録して、問題を解いてみたら終わった。ハマりそうな予感がする。