루오 구 P1020 미사일 요격 문제 솔루션

루오 구 링크 : https://www.luogu.org/problem/P1020

제목 설명

위해 국가는 미사일 요격 시스템을 개발, 적의 미사일 공격을 방어합니다. 그러나 이러한 미사일 요격 시스템은 결함이있다 : 그것은 어떤 높이에 도달하는 첫 번째 라운드를하지만 각 쉘과 상황은 높이가 도착하기 전에보다 클 수 없습니다 만. 어느 날, 레이더 들어오는 적의 미사일을 집어 들었다. 시스템으로, 베타 여전히 유일한 시스템이며, 따라서 모든 미사일을 요격하지 않을 수 있습니다.

미사일 차례 비행 높이를 입력합니다 (주어진 레이더 데이터의 높이입니다 \ 르 50000 5 0 0 0 , 당신은 설정이 최소한의 장착 할 수있는 모든 미사일을 요격 할 경우, 미사일을 요격하기 위해 얼마나 많은 시스템을 백업 계산 양의 정수이다) 요격 미사일의 종류.

입력 형식

. (1) 하나 개의 라인, 복수의 정수 (번호 100000 르 \ . 1 0 0 0 0 0)

출력 형식

이 개 2 라인이 각각의 정수 라인, 첫 번째 숫자는 모든 미사일에게 이러한 미사일 요격 시스템을 장착되는 세트의 최소 수를 차단하려는 경우, 두 번째 숫자가 표시 얼마나 많은 시스템을 백업이 미사일을 요격하는 방법을 나타냅니다.

샘플 입출력

입력 # 1
389 207 155 300 299 170 158 65
출력 # 1
6 
2

설명 / 팁

당신에게 더 나은 테스트 N 알고리즘이 질문에 열린 SPJ을주고, n은 100, nlogn200 포인트를 좌우로

내가 물었다 하위에 따라, 매 2 점을 물어


 

문제 해결

이 질문은 기본적으로 지금 인 DP 문제의 항목입니다.

첫 번째 질문을 찾는 실제로 가장 긴 시퀀스를 넘어되지 않으며, 두 번째 질문은 가장 긴 순서를 증가 찾고 있습니다.

가장 쉽게 이해할 O (N- (2) 용액), 및 O (nlogn) 수수께끼 중 일부에 대한 해결책. 가장 사용자 친화적 인에 기록 된 원칙이 제품은 : 기사 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으로 이어질 수 있습니다 경우에 따라서 두 개의 비교 조건 내부의 프로그램은 매우 중요합니다.

추천

출처www.cnblogs.com/zealsoft/p/11329558.html