루오 구 링크 : https://www.luogu.org/problem/P1020
제목 설명
위해 국가는 미사일 요격 시스템을 개발, 적의 미사일 공격을 방어합니다. 그러나 이러한 미사일 요격 시스템은 결함이있다 : 그것은 어떤 높이에 도달하는 첫 번째 라운드를하지만 각 쉘과 상황은 높이가 도착하기 전에보다 클 수 없습니다 만. 어느 날, 레이더 들어오는 적의 미사일을 집어 들었다. 시스템으로, 베타 여전히 유일한 시스템이며, 따라서 모든 미사일을 요격하지 않을 수 있습니다.
미사일 차례 비행 높이를 입력합니다 (주어진 레이더 데이터의 높이입니다 \ 르 50000 ≤ 5 0 0 0 , 당신은 설정이 최소한의 장착 할 수있는 모든 미사일을 요격 할 경우, 미사일을 요격하기 위해 얼마나 많은 시스템을 백업 계산 양의 정수이다) 요격 미사일의 종류.
입력 형식
. (1) 하나 개의 라인, 복수의 정수 (번호 100000 르 \ ≤ . 1 0 0 0 0 0)
출력 형식
이 개 2 라인이 각각의 정수 라인, 첫 번째 숫자는 모든 미사일에게 이러한 미사일 요격 시스템을 장착되는 세트의 최소 수를 차단하려는 경우, 두 번째 숫자가 표시 얼마나 많은 시스템을 백업이 미사일을 요격하는 방법을 나타냅니다.
샘플 입출력
389 207 155 300 299 170 158 65
6 2
설명 / 팁
당신에게 더 나은 테스트 N 알고리즘이 질문에 열린 SPJ을주고, n은 100, nlogn200 포인트를 좌우로
내가 물었다 하위에 따라, 매 2 점을 물어
문제 해결
이 질문은 기본적으로 지금 인 DP 문제의 항목입니다.
첫 번째 질문을 찾는 실제로 가장 긴 시퀀스를 넘어되지 않으며, 두 번째 질문은 가장 긴 순서를 증가 찾고 있습니다.
가장 쉽게 이해할 O (N- (2) 용액), 및 O (nlogn) 수수께끼 중 일부에 대한 해결책. 가장 사용자 친화적 인에 기록 된 원칙이 제품은 a342374071 : 기사 https://blog.csdn.net/a342374071/article/details/6694452 .
제 페이스트 O (N- 따라 2 ) 코드.
1 #INCLUDE <iostream> 2 #INCLUDE <STDIO.H> 3 #INCLUDE <math.h> 4 #INCLUDE <알고리즘> 5 #INCLUDE < 문자열 .H> 6 7 이용한 스페이스 성병; 8 9 CONST의 INT MAXN 1E5 + = 10 ; 10 INT N = 1 , A [MAXN], D [MAXN, DP [MAXN]; 11 (12) INT () 주 13 { 14 INT ans1 = 0 , ans2 = 0 ; 15 일 동안 (scanf와 (" %의 D ' , A [N])! = EOF) 16 { 17 ++ N; 18 } 19 - N; (20) 에 대한이 ( int로 I = 1 ; i가 N = <; 내가 ++ ) 21 { 22 D [I] = 1 ; 23 대 ( INT의 J = 1 ; J <I, J ++ ) 24 { 25는 경우 (a [j]가> = A [I]) 26 { 27 (D)를 [I] = 최대 (d [i]는, D [J] +1 ); 28 } 29 } 30 의 경우 (ans1 < D [I]) 31 { 32 ans1 = D의 [I]; 33 } 34 } 35 대 ( int로 I = 1 ; i가 N = <; 내가 ++ ) 36 { 37 DP [I] = 1 ; 38 대 ( INT의 J = 1 ; J <I, J ++ ) 39 { 40 의 경우 (a [J] < A [I]) 41 { 42 DP [I] = 최대 (DP [I], DP [J] + 1 ); 43 } 44 } 45 의 경우 (ans2 < DP [I]) 46 { 47 ans2 = DP [I]; 48 } 49 } 50 COUT << ans1 << ENDL; 51 COUT << ans2 << ENDL; 52 반환 0 ; 53 }
다음은 O (nlogn) 코드입니다 :
1 #INCLUDE <iostream> 2 #INCLUDE <STDIO.H> 3 #INCLUDE <math.h> 4 #INCLUDE <알고리즘> 5 #INCLUDE < 문자열 .H> 6 7 이용한 스페이스 성병; 8 9 CONST의 INT MAXN 1E5 + = 10 ; 10 INT N = 1 , A [MAXN], D [MAXN, DP [MAXN, ans1 = 0 , ans2 = 0 , 중간, L, R; 11 (12) INT 주 () 13 { 14 동안 (는 scanf ( " % d의" !, A [N]) = EOF)이 15 { 16 ++ N; 17 계속해서 , 18 } 19 - N; 20 (D)는 [ 1 ]은 [= (1) ] (21) (DP)를 [ 1 ] = A [ 1 ]; 22 ans1 = ans2 = 1 , 23 대 ( int로 I = 2 ; i가 N = <; 내가 ++ ) 24 { 25 의 경우 (a [I]가 <= D [ans1]) 26 { 27 ans1 ++ ; 28 (D) [이 ans1] = A [I]; 29 } 30 또 31 { 32 , L = 1 , R = ans1; 33 동안 (L < R) 34 { 35 미드 = (L + R) / 2 ; 36 의 경우 (a [I]> D [미드]) 37 { 38 , R = 미드; 39 } 40 또 41 { 42 중간 L = + 1 ; 43 } 44 } 45 D [L]가 = A [I]; 46 } 47 } 48 49 대 ( int로 I = 2 <; ++ i가 N = 나 ) 50 { 51 의 경우 (a [I]> DP [ans2]) 52 { 53 ans2 ++ ; 54 DP [ans2가] = A [I]; 55 } 56 또 57 { 58 L = 1 , R = ans2; (59) 동안 (L < R) 60 { 61 미드 = (L + R) / 2 ; 62 의 경우 (a [I] <= DP [미드]) 63 { 64 , R = 미드; 65 } 66 또 67 { 68 , L = 중간 + 1 ; 69 } 70 } 71 DP [L]가 = A [I]; (72) } 73 } 74 COUT << ans1 << ENDL; 75 COUT << ans2 << ENDL; 76 반환 0 ; 77 }
이 코드는 세부 사항에주의를 지불 할 필요가있다, 즉, 때 조건, 또는 다른 내부에 등호에 배치해야하는 경우 이진 검색. 그것이 바람직한 A [I] 및 D [미드] 동일하기 때문에 예를 들어, 서열을 추구하면 것이 바람직하다 상승하지 않는 [I]의 오른쪽에 D [미드] 수 여분 데이터 D 우측 [미드, 데이터 시퀀스가 길어 지도록 가능한 한 크게. 과실은 WA으로 이어질 수 있습니다 경우에 따라서 두 개의 비교 조건 내부의 프로그램은 매우 중요합니다.