0
Help us understand the problem. What are the problem?

ABC001 メモ

A - 積雪深差

問題文通り、答えは$H_1-H_2$。

001A.py
H_1 = int(input())
H_2 = int(input())

ans = H_1 - H_2
print(ans)

B - 視程の通報

入力は単位がメートル(m)で与えられるが、判定条件は単位がkmで与えられているため、少々複雑になる。

今回は判定条件をmに統一して計算した。

001B.py
m = int(input())

if m < 100:
    VV = '00'

elif m <= 5000:
    if len(str(m)) == 4:
        VV = str(m)[:2]
    else:
        VV = '0' + str(m)[0]

elif m <= 30000:
    VV = str(m//1000+50)

elif m <= 70000:
    VV = str((m//1000-30)//5+80)

else:
    VV = '89'

print(VV)

C - 風力観測

問題文通り実装した。場合分けが煩雑なのと、小数を扱う場合には誤差に注意が必要。小数の扱いについては、整数で扱えるように条件式を加工した。

具体的には、風速は分速のまま扱えるようにした。今回の場合、風速$0.2$m/s以下という条件は、$0.25$m/s未満と同値なため、これを60倍して$15$m/min未満、というようにすることで、小数の計算を避けた。

公式の解説にあるように、場合分けを手動でたくさん書くのはあまり望ましくないのだが…

001C.py
Deg, Dis = map(int, input().split())

if Deg <= 112:
    Dir = 'N'
elif Deg <= 337:
    Dir = 'NNE'
elif Deg <= 562:
    Dir = 'NE'
elif Deg <= 787:
    Dir = 'ENE'
elif Deg <= 1012:
    Dir = 'E'
elif Deg <= 1237:
    Dir = 'ESE'
elif Deg <= 1462:
    Dir = 'SE'
elif Deg <= 1687:
    Dir = 'SSE'
elif Deg <= 1912:
    Dir = 'S'
elif Deg <= 2137:
    Dir = 'SSW'
elif Deg <= 2362:
    Dir = 'SW'
elif Deg <= 2587:
    Dir = 'WSW'
elif Deg <= 2812:
    Dir = 'W'
elif Deg <= 3037:
    Dir = 'WNW'
elif Deg <= 3262:
    Dir = 'NW'
elif Deg <= 3487:
    Dir = 'NNW'
else:
    Dir = 'N'

if Dis < 15:
    Dir = 'C'
    W = 0
elif Dis < 93:
    W = 1
elif Dis < 201:
    W = 2
elif Dis < 327:
    W = 3
elif Dis < 477:
    W = 4
elif Dis < 645:
    W = 5
elif Dis < 831:
    W = 6
elif Dis < 1029:
    W = 7
elif Dis < 1245:
    W = 8
elif Dis < 1467:
    W = 9
elif Dis < 1707:
    W = 10
elif Dis < 1959:
    W = 11
else:
    W = 12

print(Dir, W)

D - 感雨時刻の整理

時間の区間を扱う問題だが、今回は最小の単位が分であり、最長でも1440分なので、配列で保持しても十分高速に計算できそう。

入力を00:00からの分に計算し直し、配列に保持する。この時、区間全てに対して計算を行う必要はなく、始まった時と終わった時に対して計算を行う、いわゆる「いもす法」で扱えば十分である。

計算量は$N$が大きい時でも$O(N)$程度であるため、十分高速。

001D.py
def adj(num):
    h = str(num//60)
    m = str(num%60)
    time = h.zfill(2) + m.zfill(2)
    return time


N = int(input())

lst = [0]*1442

for i in range(N):
    S, E = input().split('-')
    S = 60*int(S[:2]) + int(S[2:])
    E = 60*int(E[:2]) + int(E[2:])


    if S%10 < 5:
        S -= S%10
    else:
        S -= S%10
        S += 5

    if 0 < E%10 < 6:
        E -= E%10
        E += 5
    else:
        E += 5
        E -= E%10

    lst[S] += 1
    lst[E+1] -= 1

tmp = 0
S = -1
E = -1
for i in range(1442):
    tmp += lst[i]
    if tmp and S == -1:
        S = i

    if tmp == 0 and S != -1:
        E = i-1
        S = adj(S)
        E = adj(E)
        print(S + '-' + E)
        S = -1

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?