アールグレー特売所

ゲームやら競プロやらのメモ書き

AtCoder ABC112参戦記

今回はABDの3完でした。C問題は全探索することまでは思いつきましたが、実装の仕方が悪くWAでした。以下C問題とD問題のコードです。

 

C問題(Pyramid)

def dist(a, b, x, y, h):
    return h + abs(a - x) + abs(b - y)

N = int(input())
P = []
for i in range(N):
    x, y, h = map(int, input().split())
    P.append([h, x, y])
P.sort(reverse = True)

for i in range(101):
    for j in range(101):
        H = dist(i, j, P[0][1], P[0][2], P[0][0])
        for p in P[1:]:
            if max(H - abs(p[1]-i)-abs(p[2]-j), 0) != p[0]:
                break
        else:
            print(i, j, H)
            break

少なくとも一つは1以上の高さを持つので、hの順にソートして、最初の座標情報からすべてのマスの仮の高さを設定します。その高さが残り全ての座標情報と矛盾しなければ、そのマスが求めたい頂点となります。

 

D問題(Partition)

import math
N, M = map(int, input().split())
ulim = M//N
mid = int(math.sqrt(M))
if ulim >= mid:
    ans = []
    for i in range(1, mid+1):
        if M%i == 0:
            ans.append(i)
            if M//i <= ulim:
                ans.append(M//i)
    print(max(ans))
 
else:
    for i in reversed(range(1, ulim+1)):
        if M%i == 0:
            print(i)
            break

こちらのほうがC問題より簡単だったと思います。M//N以下のMの最大の約数は何かという問題に言い換えることができます。あとは√M とM//Nの大小関係に注意して実際に約数を探索すれば良いです。