Port 53

明日のための技術メモ

AtCoder ABC144

AtCoder ABC144解いた分だけ書きます。
ここ1ヶ月、右手を痛めたので、コンテスト参加できずゆっくり解いてました。
皆さんも手の使いすぎにはお気をつけて...

A. 9×9

問題文

f:id:saturn-glave:20191110114338p:plain
A問題

場合分けをして踏めば分岐させる。
先に制約が厳しいものから割り振る。

#coding:utf-8
a, b = map(int, input().split())

if a >= 10 or b >= 10:
    print(-1)
else:
    print(a*b)

B. 81

問題文

f:id:saturn-glave:20191110114650p:plain
B問題

Aの発展系みたいな問題だった。
数が少ないので、2重ループ回して全探索でいってみる。
ヒットするパターンがあれば抜けて、flagをYesに変える。

#coding:utf-8
n = int(input())
flag = 'No'

for i in range(1, 10):
    for j in range(1, 10):
        if i*j == n:
            flag = 'Yes'
            break

print(flag)

C. Walk on Multiplication Table

問題文

f:id:saturn-glave:20191110114957p:plain
C問題

例を中心にパターンを書き出すと、座標(a, b)(ただしa≦b)に行くまで
移動回数が a+b-2 であることが分かった。
なので、n = a * bを満たすnについて、a+b-2の最小値を出せばいい。
するとaの探索範囲がsqrt(n)で良いことになる

#coding:utf-8
import math

#移動回数はa+b-2。これを満たす座標(a,b)について、a,bの最小値
#探索範囲はsqrt(N)まで、a<=b
n = int(input())
ans = n-1

for i in range(2, int(math.sqrt(n))+1):
    if n % i == 0:
        ans = min(ans, n//i + i - 2)

print(ans)