#はじめに
AtCoder Beginner Contest 161をPythonで実装したので、復習も兼ねて投稿します。
C++で実装する人が多いですが、私はPythonに最も慣れているのでそちらで記事を細々と書いていけたらなと考えています。
#A - ABC Swap
A問題は3つの箱(a,b,c)があって、その中に数字が入っています。
入力として3つの数字が渡され、
・aとbの箱の中の数字を入れ替えます。
・aとcの箱の中の数字を入れ替えます。
この二つの操作のあと、a,b,cの箱の中の数字を出力します。
1行目でinput()をstring型で受け取って、空白で分割してリストを作成し、リストの要素を変数に代入しました。2行目で二つの操作が終わったあとの数字を出力しました。
a,b,c=input().split()
print(c,a,b)
単純なので、素早く解きたい問題です。
書くことも少なくて困っています笑
入力の受け方として、map関数を使うことも可能です。
a,b,c=map(str,input().split())
#B - Popular Vote
入力として
n,m
A1 A2 ... An
が与えられます。nこの商品のそれぞれの得票数がA1のように与えられていて、その内mこの商品を選ぼうとしています。その時、商品の得票数はそう得票数の${1/{4m}}$倍以上でなければならないです。
まず、これらの入力をn,m,numで受け取りました。
num配列を降順にする事によってm-1番目までの要素が上の条件を満たしているかを考えれば良いです。(コンテスト中はこのように実装しましたが、forを使わずにnum配列のm-1番目の要素が条件を満たすかどうかだけ考えれば十分でした。後述。)
for が途中で止まればNo、止まらずに終わればYesと出力しました。
n,m=map(int,input().split())
num=[int(i) for i in input().split()]
num=sorted(num,reverse=True)
sum_num=sum(num)
for i in range(m):
if num[i]<sum_num/(4*m):
print("No")
break
else:
print("Yes")
先ほどのforが不要な件。num配列を降順にしている段階で、m-1番目よりも手前の要素は大きいので考える必要がありません。この問題は入力数が少なかったので大丈夫でしたが、下のように実装した方が無難ではあります。
n,m=map(int,input().split())
num=[int(i) for i in input().split()]
num=sorted(num,reverse=True)
sum_num=sum(num)
if num[m-1]<sum_num/(4*m):
print("No")
else:
print("Yes")
#C - Replacing Integer
入力としてnとkが与えられて、
n=|n-k|として更新していき、nが最も小さくなる時の値を考えます。
愚直に引き算していくことが考えられますが、nのオーダーが$10^{18}$であるので、kに1などの小さい数が入力された場合にタイムアウトしてしまいます。
ですので、別の方法を考えなければなりません。
具体的な数で考えてみます。n=128,k=5とした時にnはどんどん小さくなっていくので、0以上の時で最小となるのは3です。これは128を5で割った時の余りです。
また、n=|3-5|=2とnが0以上の時で最小となる値からkを引くと、絶対値の中が負の場合のnの最小値を求めることができました。これは-128を5で割ったあまりと考えられます。この二つの値の内どちらかが、最小値となるのでmin()関数を用いて出力しました。
n,k=map(int,input().split())
print(min(n%k,-n%k))
この問題はオーダーが明らかに大きかったので、工夫しなければならないことを発想しやすかったと思います。
#終わりに
ご覧いただきましてありがとうございました。今回は実装よりも思考力が必要となる問題であったと思います。まだまだ未熟ですが、できれば毎週記事にしていこうと思います。時間内にはC問題までしかできなかったので、D問題も解いて追記できればなと考えています。