나는 Codility Counting Lesson (https://codility.com/media/train/2-CountingElements.pdf)을 공부하고 있으며, 가장 빠른 해결책을 이해하는 데 도움이 필요합니다.Codility Counting Lesson
왜 8 라인에서 차이가 2로 나뉘어 지는지 궁금합니다 d //= 2
? 우리가 배열간에 교환 할 수있는 요소를 찾기에 차이가 없어야합니까?
당신이 정수
m
(1 < m < 1000000
)와 두 개의 비어, 제로 인덱스 배열A
및B
n
의 정수,a0
,a1
를 부여, ...,an−1
b0
,b1
, ...,bn−1
(0 < ai
,bi < m
). 배열A
의 요소 합계가 스왑 후 배열B
의 요소 합계와 같도록 이러한 배열에서 이 될 수있는 스왑 연산이 있는지 확인하는 것이 목표입니다. 스왑 연산이란 배열A
에서 하나의 요소를 선택하고 배열B
에서 요소 하나를 가져 와서 교환하는 것을 의미합니다.
용액 :
def fast_solution(A, B, m):
n = len(A)
sum_a = sum(A)
sum_b = sum(B)
d = sum_b - sum_a
if d % 2 == 1:
return False
d //= 2
count = counting(A, m)
for i in xrange(n):
if 0 <= B[i] - d and B[i] - d <= m and count[B[i] - d] > 0:
return True
return False
'원래의 차이점을 반으로 줄이는 것이 정확합니다. (홀수 인 경우 스왑이 작동하지 않습니다.) - 차이가 홀수 인 경우 정확하게 스왑이 작동하지 않는 이유는 무엇입니까? – dhblah
@dhblah, 두 정수 배열의 합계의 차이가 홀수 인 경우에는 스와핑을 통해 합계를 균등하게하는 ** 방법이 없습니다 ** - 합계 사이의 차이가 홀수 인 경우 증명하기 쉽습니다. 합계의 합계, 그래서 당신은 각각의 합계를 "동등하게"할 것입니까? 분수? 분명히 할 수는 없어! -) –
'합계의 차이가 이상한 경우 합계의 합계가 너무 작다는 것을 증명하기 쉽다. - 그렇다. 나는 그것을 증명할 수있다. 그러나 아직도 그것은 어떻게 불가능하게합니까? – dhblah