1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | for t in range(int(input())): N = int(input()) lis = list(map(int,input().split())) x = lis[:N] m = lis[N:] print(f'#{t+1} ',end='') for i in range(N-1): l = x[i] r = x[i+1] for _ in range(50): s = 0 mid = (l+r)/2 for k in range(i+1): s += m[k]/((mid-x[k])*(mid-x[k])) for k in range(i+1,N): s -= m[k]/((mid-x[k])*(mid-x[k])) if s > 0: l = mid else: ans = mid r = mid #print(mid) print('%.10f' % ans ) | cs |
알고리즘 분류 - 이분 탐색
1. s를 0으로 두고 왼쪽 자성체가 당기는 힘을 s에 더하고 오른쪽 자성체가 당기는 힘을 s에서 뺀다.
2. s가 0이 되면 균형점이다.
3. s가 0보다 크면 mid를 left로 놓고, 0보다 작으면 mid를 right로 둔다.