AtCoder Beginner Contest 112

はい。
https://atcoder.jp/contests/abc112

A - Programming Education

Python3

n=int(input())
if n==1:
    print("Hello World")
    exit()
 
a=int(input())
b=int(input())
print(a+b)

問題文の指示通りに。

B - Time Limit Exceeded

Python3

n,t=map(int,input().split())
ans=chk=10000
for i in range(n):
    x,y=map(int,input().split())
    if y<=t: ans=min(ans,x)
print(ans if ans<10000 else "TLE")

時間とコストを確認する。

C - Pyramid

Python3

n=int(input())
x,y,h=map(int,input().split())
d=set([(x,y,h)])
t=[x,y,h]
for i in range(n-1):
    x,y,h=map(int,input().split())
    d.add((x,y,h))
    if t[2]==0: t=[x,y,h]
 
for i in range(101):
    for j in range(101):
        f=0
        p=abs(t[0]-i)+abs(t[1]-j)+t[2]
        for k in d:
            if k[2]!=0 and abs(k[0]-i)+abs(k[1]-j)+k[2]!=p: f=1
            if k[2]==0 and abs(k[0]-i)+abs(k[1]-j)+k[2]<p: f=1
        if f==0:
            print(i,j,p)
            exit()

x,yそれぞれ0から100までの全座標を中心と仮定して調べても間に合うらしい。入力中のとある1件を基準として中心地点の高さも仮定するようにした。但し、高さを仮定する際に基準とする高さが0の場合に遠すぎて見えない場合も高さは負の値ではなく0となっていて計算がずれるので解が合わなくなるので注意。

D - Partition

PyPy3

n,m=map(int,input().split())
for i in range(m//n,0,-1):
    if m%i==0:
        print(i)
        break

確かに確かに理屈を聞けばそうなんですねという感じですけども、どうやってこれをサラッとコンテスト中に思いつけるのか。
長さNで総和がMになる数列の最大公約数が〜ということは数列a内の数が全てMの約数である必要がある(そうでないと大きい数がある場合でも解が1ということになってしまう?)
数列a内の最小の数が解の最大公約数ということになる?
↑であり得る最小の数の最大は全て同じ数が並ぶ場合の時である(例えばN=3 M=15だと、a=(5,5,5)で5が解かな、多分)?
なのでforループ大きい方のM/Nから始めて1まで見て、Mが割り切れる数の時にそれが解になる。