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

参照

atcoder.jp

A問題

鬼簡単です。

print(int(input())**3)

B問題

配列がややこしく、
頭が混乱して思ってたより時間がかかってしまいました・・・。
次回から時間を測って、かかった時間をブログに記載していこうと思います。
そうした方がスコア伸びるかな。

n=int(input())
a=list(map(int,input().split()))
b=list(map(int,input().split()))
c=list(map(int,input().split()))
sum_=0
 
for i,menu in enumerate(a):
  sum_+=b[menu-1]
  if i>0:
    if menu==a[i-1]+1:
      sum_+=c[menu-2]
print(sum_)

C問題

A(N)は未知の配列で、B(N-1)は既知の配列です。
ただし条件として、B(i)≥sum(A(i),A(i+1))の制約があるようです。

自分なりに分かりやすくサンプルパターンを生成してみました。

B 0 153 10 10 23
A 0   0 10 10 10 23

B 0 153 153 00 20 10 10 23
A 0   0 153 00 00 10 10 10  23


眺めてみると、配列の後ろからAの要素を当てはめたほうが良さそうだと思い、
逆算的な発想でアルゴリズムを考えます。

B(i)はA(i)とA(i-1)の最大値とされているので、
A(i)はB(i)とB(i-1)の最小値とする考え方を利用するとうまくいきます。

n=int(input())
b=list(map(int, input().split()))
a=[0]*n
for j in range(n-1,-1,-1):
  if j==n-1: a[n-1]=b[j-1]
  elif j==0: a[0]=b[0]
  else:
    a[j]=min(b[j],b[j-1])
print(sum(a))