LoginSignup
0
0

More than 3 years have passed since last update.

AtCoder Beginner Contest 133の復習

Posted at

B - Good Distance

問題文

D次元空間上に N個の点があります。i 番目の点の座標は (Xi1,Xi2,...,XiD) です。
座標 (y1,y2,...,yD) の点と座標 (z1,z2,...,zD) の点の距離は √(y1−z1)2+(y2−z2)2+...+(yD−zD)2です。
i番目の点と j 番目の点の距離が整数となるような組 (i,j) (i<j) はいくつあるでしょうか。

入力例

3 2
1 2
5 5
-2 8
3 4
-3 7 8 2
-12 1 10 2
-2 8 9 3

自分の考えた解答

多次元配列にあたふたしてしまった
全然スマートにできなかった反省
できるかなと思ったけど通せなかった 死にたみが増す

import math
#Nこの点 D次元
N, D = map(int, input().split())
points = []
count = 0
for i in range(N):
    points.append(list(map(int, input().split())))

def combinations_count(n, r):
    return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))

#一次元を考える
if D == 1:
    print(combinations_count(N, 2))

else:
    #number0のとりうるあたいは0からN-1
    for number0 in range(0,N):
        ans = 0
        if number0 != N-1: 
            for number1 in range(0,D):
                #print("先",number0,number1,"後",number0+1,number1)
                ans = ans + pow(abs(points[number0][number1]) - abs(points[number0+1][number1]),2)
        else:
            for number1 in range(0,D):
                #print("先",number0,number1,"後",0,number1)
                ans = ans + pow(abs(points[number0][number1]) - abs(points[0][number1]),2)

        #print("ans",math.sqrt(ans).is_integer())
        if math.sqrt(ans).is_integer() == True:
            count = count + 1

    print(count)

参考にした解答

N, D = map(int, input().split())
X = [[int(i) for i in input().split()] for i in range(N)]

print(X)

ans = 0
##関数にするのがよい
def dis2(x,y):
    #配列に詰めておく
    T = []
    for i in range(len(x)):
        T.append((x[i]-y[i])**2)
    #配列の合計をここでかえす
    return sum(T)

for i in range(N):
    for j in range(i+1,N):
        print("i",i,"j",j)
        print("X[i]",X[i],"X[j]",X[j])
        #それぞれの次元の配列の合計を返す
        R = dis2(X[i],X[j])
        for k in range(R+1):
            #これで整数かどうかをみている
            if k**2 == R:
                ans +=1

print(ans)

敗因

多次元配列の扱いに苦戦してしまった
模範解答のように、配列を渡して処理をする関数を作ればよかったなと思った

C - Remainder Minimization 2019

問題文

非負整数 L,Rが与えられます。 2つの整数 i,jを L≤i<j≤Rを満たすように選びます。 (i×j)mod 2019
の最小値を求めてください。

入力例

2020 2040

 自分で考えた解答

L, R = map(int, input().split())
small = 1000
if L+1 == R:
    print(L*R)
else:
    for number in range(L,R-1):
        ans = number*(number+1)%2019
        if small > ans:
            small = ans

    print(small)

絶対計算量すごいことになるだろうなと思いながら書いたのでダメだった

参考にした模範解答

L,R=map(int,input().split())

R=min(R,L+2019)
#print(L,R)  

COUNT=2019
NUMBER=0

for i in range(L,R+1):
  for j in range(i+1,R+1):
    print("i",i,"j",j)

    NUMBER=i*j%2019
    #print(i,j,NUMBER)
    if COUNT>NUMBER:
      COUNT=NUMBER
      #print(i,j,NUMBER)


print(COUNT)

二重ループは使うけど、あまりは2019以下でさがしていけばいいのかとなった
うーんくやしい

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0