見出し画像

あとでこれ使えばよかったってなるやつ。(ABC88B)

こんばんは。
先日投稿した記事にいいねがついていたんですが(もしかして’いいね’ではない?)、その人のプロフィールにエンジニア向けって書いてあってなんかすみませんってなりました。pythonに関しては完全に趣味で大学では全然関係ないところを学んでおります。

まあ私の専攻科目のことはどうでもいいんですが(ならなぜ話した)、今日はABC88のB問題をやったのでそのことについて話したいと思います。

N枚のカードがあります. 
i枚目のカードには, aiという数が書かれています.
Alice と Bob は, これらのカードを使ってゲームを行います. ゲームでは, Alice と Bob が交互に 1 枚ずつカードを取っていきます. Alice が先にカードを取ります.
2 人がすべてのカードを取ったときゲームは終了し, 取ったカードの数の合計がその人の得点になります. 2 人とも自分の得点を最大化するように最適な戦略を取った時, Alice は Bob より何点多く取るか求めてください.
(上記URLのページより引用)

それで、わたしが書いた回答がこれです。

N=int(input())
N+=1
a=list(map(int,input().split()))
a.append(0)
A=sorted(a)
ans=0
for i in range(N//2):
   ans+=A[-i*2-1]-A[-i*2-2]
print(ans)

で、これは25msでACしたわけです。

なんで0を加えたかというと、後ろからとるときに最後の数をどうカウントするかがよくわからなくて、とりあえず先頭のかずを0にしておけばNが偶数でも奇数でもなんとかなるんじゃね?と思ったからです。(Nが奇数なら最後のforはx-0になるしNが偶数ならforで先頭の数が拾えないけど0だから問題ない)今思えば偶数奇数の判断をして奇数ならA[0]を加えればいい気がしますが。

で、もっと早い解き方ないかなって思ってpythonでの世界の提出結果を調べたら

#一部抜粋、input過程は省きます
A=sort(reverse=1)
print(sum(A[::2])-sum(A[1::2]))

そうだ、それ使えばいいんだった。ってなりました。

今日学んだこと

逆向きにsortしたいときはsort(reverse=1) ※reverse=1 の1はTrueと等価

2個飛ばしの時は[::2] ※[start:end:skip]である

まだまだがんばらないと…茶色までの道は遠いです!

この記事が気に入ったらサポートをしてみませんか?