AtCoder Beginner Contest 156 過去問 (A~C)

参照

atcoder.jp

A問題

AtCoderの仕組みがわかりました。
とりあえぜ表示レーティングを上げるには、
10回以上コンテストに参加しないと不利らしいです。

n,r=map(int,input().split())
if n>=10: print(r)
else: print(r+100*(10-n))

B問題

再帰関数の基礎となる問題。
10進数をn進数へ変換する問題です。

qiita.com

再帰関数を活用する上で重要事項は3つ。

  • 入力(引数)と出力(戻り値)を明確に
  • 関数内で使用する再帰関数は"実装済"の関数として考える
  • 無限ループにさせない為にif文を設定

以下のコードでは、
nとqの商が0になった時に再帰関数のループは終了します。

n=11,q=2の場合

11/2 + '1'
   ー5ー5/2 + '1'
              ー2ー2/2 + '0'
                        ー1ー1/2 + '1'
                                 ー0

剰余は深い戻り値を先頭になるので'1011'
def base10toq(n,q):
  if int(n/q): return base10toq(int(n/q),q)+str(n%q)
  return str(n%q)

n,k=map(int,input().split())
print(len(base10toq(n,k)))

C問題

問題は最小二乗法の最小総和を求める問題です。
素数がNで、Xiは各要素の値です。
1≤N≤100、1≤Xi≤100なので、二重ループが可能です。

数列の授業で習った総和の展開公式でも活用して、
数学的に解く問題かと思いきや、割とゴリ押し。

n=int(input())
x=list(map(int, input().split()))
min_=10**9
for i in range(min(x),max(x)+1,1):
  sum_=0
  for j in range(n):
    sum_+=(x[j]-i)**2
  if sum_<min_: min_=sum_
print(int(min_))