답변:
다음 관찰로 시작하겠습니다.
하자 나타내고 시퀀스의 최대 1 , . . . , a n , 및 m i n 이 최소값을 나타내 도록하자 . 경우 1 =가 있어요 X를 다음 선택 b를 1 = B (2) = . . . = b n = ⌊ ( m a x + m i n ) / 2 ⌋ 가 최적입니다.
왜 그런가요? 시퀀스가 최대 값으로 시작하기 때문에 크게 선택 하고 시퀀스의 최소값에서 큰 편차를 겪거나 (이후의 b i 가 b 1 보다 크거나 같아야하므로 ) b 1 작게 선택합니다 m a x 로의 편차를 겪는다 . 평균은 최대 편차를 최소화합니다.
이제이 관측 값을 일반화하여 일반 시퀀스 . 예를 들어, 우리는 각각의 시퀀스를 서브 시퀀스로 분할하여 각각이 서브 시퀀스의 최대 값으로 시작되도록 할 수 있습니다.
예 : 은 ( 2 ) , ( 6 , 4 , 1 , 5 , 2 ) , ( 8 , 7 , 5 , 1 ) .
이 파티션을 감안할 때, 우리는 이제 별도로 각이 서브 시퀀스를 해결하고의 할당받을 수 있습니다 그러나 비 감소 조건을 위반할 수의를. 이것은 최적의 손실없이 수정 될 수 있습니다.
마지막 하위 시퀀스에는 항상 전체 시퀀스 의 최대 가 포함 됩니다 (그렇지 않으면 이후에 다른 하위 시퀀스가 있음). w 1 , w 2 ,로 하자 . . . , w k 는 k 개의 서브 시퀀스에 할당 된 값 입니다. 이제, w 1 , 비 감소를 달성하기 위해 . . . , w k , 우리는 w k 에서 뒤에서 시작 하여 앞으로 나아갑니다. 경우 승 K - 1 보다 큰 w , 우리는 단순히 w k - 1 : = w k를 설정 합니다. 더 작 으면 유지합니다. 그런 다음 w k - 2 와 w k - 1 등을 비교하는 과정을 진행합니다. 참고 임의 낮추는 것을 w I을 의 값 w는 I + 1 서브 시퀀스의 maximium 값이 할당되기 때문에, 절대 편차가 증가하지 승 내가 항상 할당 서브 시퀀스의 최대 값보다 낮은 w I + 1 .
이 알고리즘은 정확해야한다고 생각합니다. 실행 시간과 관련하여 핵심 단계는 하위 시퀀스에 대해 증가하는 최대 값을 계산하는 것이며, 이는 ? 내가 어디에 기여 하는지 확실하지 않습니다 .
나는 당신이 준 힌트를 통해 일하면서 크게 크게 생각할 것입니다. 이 먼저 시도해야한다는 원래 힌트로 이동합시다 . 그 시간이있는 욕심 많은 알고리즘을 생각할 수 있습니다.
시간 복잡도 의 부분은 각 값 0 의 각 발생 횟수 목록을 유지할 수 있음을 의미합니다 . l . 즉, 세트 에서 각 l 의 개수를 추적하는 Count = C 0 , … , C l 세트를 작성하기 만하면 됩니다. 입력 순서를 한 번 스캔하여 초기화 목록을 작성할 수 있습니다.
이 목록을 로 스캔 하여 최대 값과 최소값을 얻을 수 있습니다. b 의 전체 목록을 이 중간 점 으로 채우 려면 분산이 단순히이 값과 최대 / 분의 차이 일 것입니다. 이것은 기본적으로 최악의 시나리오 입니다. b w 라고합시다 .
그래서 당신의 방식으로 작동 왼쪽에서합니다. Count 에서이 elemeent를 삭제 하고 O ( l ) 에서 b [ i + 1 ] … b [ n ] 의 최소 / 최대 값을 얻을 수 있습니다 . 이제 우리는 탐욕 스러울 수 있습니다. 우리는 b i > b w를 선택하지 않기 때문에 나머지 전체 목록을 강제로 (비 감소 요구 사항을 충족시키기 위해) 강제로 분산을 증가 시키므로. 우리가 선택할 수있는 최소값은 b [ i - 1 ] 입니다. 만약 전최소값을 사용하는 것보다 범위 미만인 경우 선택 가능한 범위 내에 있습니다. 이것에 분산을 최소화 알려진 제약을 부여.
이것은 단지 아이디어 일 것입니다. 아마 운이 좋으며 올바른 방향으로 당신을 가리 킵니다. 이 알고리즘은 작동하지 않을 수도 있지만 (몇 가지 간단한 테스트에서는 가능) 주어진 힌트와 일치하므로 도움이 될 수 있습니다. 는 것을 쉽게 알 수있다 올바른 경우 확실히 일부 캔가 삭제 될 O ( 로그 리터 ) 에 대한 더욱, 나는 확실하지 않다.
교수의 해법은 다음과 같습니다. "환원": 0 에서 l 까지의 각 에 대해 편차가 i 보다 작거나 같다는 것을 알고 있다면 해를 구해보십시오 . 해를 구할 수있는 첫 번째 i 는 최소 편차입니다. O ( n ) 시간 의 편차가 주어지면 해를 구할 수 있습니다 . 따라서 실행 시간은 O ( n l ) 입니다. 그런 다음 선형 검색을 사용하는 대신 이진 검색을 사용하여 솔루션이 가능한 최소 편차를 결정할 수 있습니다. 이렇게하면 실행 시간이 O로 줄어 듭니다 ( n log l, which satisfies the requirement of .
I think this should be doable in O (n).
Take the similar problem: Given , 1 ≤ i ≤ n, and d ≥ 0, find in non-descending order such that for all i, or show that it isn't possible. This can be done in O (n), and using binary search the original problem is solved in O (n log l).
Now if there are i ≤ j such that a_i - a_j > 2d, then there is no solution (because ).
But if a_i - a_j ≤ 2d for all i ≤ j then I think a solution will always be found. So all we have to do is find m = max (a_i - a_j) for all i ≤ j, and choose d = floor ((m+1) / 2). That maximum can be found in O (n).