テービーテックのデータサイエンス

未経験リケジョがゼロからデータサイエンティストを目指す姿を記す奮闘記です。2019/12/05文系出身者が共同で更新を開始

TAG index

AtCoder-練習問題を解きまくる3

f:id:tbtech:20210722140215p:plain
今日もAtCoderの練習問題を解きまくるよ~(*´▽`)ノ

ABC048B - Between a and b ...

f:id:tbtech:20210722092205p:plain

a,b,x = map(int,input().split())
ans = b//x - a//x
if a%x == 0:
  ans +=1
print(ans)

a,b,xにそれぞれ入力値を格納します。
b//x, a//xはxで割って小数点以下は切り捨てをします。
その差をansへ入れています。
例えばa=3,b=8,x=2として、3以上8以下の数で2で割り切れる数を考えると
b//x=8//2=4, a//x=3//2=(1.5を切り捨てて)1となり、4-1=3になります。
実際3~8で2で割れるのは、4,6,8の3つなので合っていますね。
では、a=4,b=8,x=2として、3以上8以下の数で2で割り切れる数を考えると
b//x=8//2=4, a//x=4//2=2となり、4-2=2になります。
実際は4~8で2で割れるのは、4.6.8の3つで上の計算と合いません。
これはaがちょうどxで割り切れると起こります。
なのでif a%x == 0でaがちょうどxで割り切れる場合は、ans +=1を行います。
最後にansを出力して終了です。

ABC049B - たてなが

f:id:tbtech:20210722094107p:plain

h,w, *x = open(0).read().split()
y=[]
for i in x:
    for j in range(2):
        print(i)

h,wに画像の縦横のピクセル数を入れ、xに1行毎の文字を入れていきます。
例題1の場合、h=2,w=2,x=[' *. ' , ' .* ']となります。
for i in xでxを初めの要素から順に取り出しiへ入れます。
for j in range(2)でprint(i)を2回繰り返しさせます。
xに入れた各行の文字を2回ずつ出力することで、画像を2倍の縦長に表示します。

ABC050B - Contest with Drinks Easy

f:id:tbtech:20210722100830p:plain

f:id:tbtech:20210722100630p:plainf:id:tbtech:20210722100453p:plain
f:id:tbtech:20210722101052p:plain

n=int(input())
T=list(map(int,input().split()))
m=int(input())
P = [list(map(int, input().split())) for _ in range(m)]
import copy
for i in range(m):
    T_c = copy.copy(T)
    T_c[P[i][0]-1]=P[i][1]
    print(sum(T_c))

各入力値をそれぞれ変数に格納します。
Pは[[1, 1], [2, 3]]の様な形で、問題番号とそれにかかる時間を入れます。
初めにドリンク無しで各問題にかかる時間リストTをT_cにコピーします。
リストをコピーする際は、変数への代入は使えないのでこのcopyを使います。
P[i][0]はリストPにある問題番号を順に取り出すことを表します。
問題番号は1~でリストのindexは0~なので、揃えるためにP[i][0]-1します。
そうしてPにある問題番号に対応するT_cリスト内の時間をP内の時間で更新します。
問題を1つ更新したらかかる時間の合計を出すためT_cのsumを出力します。
これをそれぞれのP内の問題で更新して出力を繰り返します。

ABC055B - Training Camp

f:id:tbtech:20210722110056p:plain

n=int(input())
p=1
for i in range(1,n+1):
  p=p*i%1000000007
print(p)

nに何回トレーニングするかを入れます。
トレーニング後のパワーを求めたいので、初期値p=1で準備します。
現在のトレーニング回数をiとして1~N回繰り返します。
トレーニング前のpにiをかけて、トレーニング後のパワーとしてpを更新します。
「答えの値は非常に大きな値になることがあるので 10^9+7で割ったあまりを出力してください。」とありますが、難しく考える必要はなく、計算した値を毎回1000000007で割った余りを出せば良いのです。
以上を繰り返し、トレーニング修了時のpを出力します。

ABC056B - NarrowRectanglesEasy

f:id:tbtech:20210722112010p:plain
f:id:tbtech:20210722111849p:plain

w,a,b=map(int,(input().split()))
if a<=b+w<=a+w or a<=b<=a+w:
  print(0)
elif b+w<a:
  print(a-(b+w))
else:
  print(b-(a+w))

w,a,bへ入力値を格納します。
f:id:tbtech:20210722115643p:plain
まずは、初めから2つのブロックが連結しており、移動が0の場合です。
上図のようにa≦b+w≦a+w と a≦b≦a+wのとき
既に連結しているので、0と出力します。
f:id:tbtech:20210722120116p:plain
次に2つのブロックは連結しておらず、緑ブロックが赤ブロックより左にある場合です。
最小移動量はa-(b+w)になります。
f:id:tbtech:20210722120221p:plain
最後は2つのブロックは連結しておらず、緑ブロックが赤ブロックより右にある場合です。
先程と同様に最小移動量はb-(a+w)になります。
それぞれ最小移動量を出力して終了です。

ABC056C - Go Home

f:id:tbtech:20210722130548p:plain
f:id:tbtech:20210722130743p:plain

x=int(input())
t=1
while x>0:
  x-=t
  t+=1
print(t-1)

カンガルーの家までの距離をxへ入れます。
カンガルーはある地点で、出発してからの時間がtの時、t進むことができますし、
進まずその場に留まることができます。
まずx=1~のときの到着にかかる時刻の最小値tを順に考えてみましょう。
x=1のとき1で進む⇒t=1
x=2のとき0,2で進む⇒t=2
x=3のとき1,2で進む⇒t=2
x=4のとき1,0,3で進む⇒t=3
x=5のとき0,2,3で進む⇒t=3
x=6のとき1,2,3で進む⇒t=3
x=7とき0,0,3,4で進む⇒t=4
以上からtの結果が1が1個、2が2個、3が3個,,,と続くことがわかります。
t=1を初期値として、xが0以下になるまでxをtで引き、tを1づつ増やします。
xが0以下になるった時のt-1がx属するtの値になります。


今回はCレベルの問題もあって少し難しかったですね~(´ε`;)
つづく٩(ˊᗜˋ*)و