P1678 문제가 대학 입학 시험

P1678 시험 링크 : https://www.luogu.org/problem/P1678

난이도 : 범용 -

알고리즘 태그 : 아날로그, 욕심, 정렬, 이진 검색

1. 간단한 아날로그 O (m에서 * n)도 30 점수

m 학교에 입학하기 위해 우선, 다음 후보에서의 결과 각 후보의 결과 i 번째 대학을 찾기 위해 (i 번째 대학 이상 또는 후보자의 동일한 결과 큰 대학 입학 점수 인 경우) I-1 I-1 번째의 입학 및 i 번째 대학과 필요에 따라 상기 각 후보의 절대 값의 최소값을 감산 한 결과와, i 번째 대학 간의 제 입학 라인 번째 작은 더한 값의 절대 값의 합을 모두 최종 해답은 합이다

1 #INCLUDE <cstdio>
 2 #INCLUDE <알고리즘>
 3  사용  스페이스 성병;
4  INT의 m, n은,이 [ 100010 ], B [ 100010 ];
5  INT ) (주
 6  {
 7      는 scanf ( " %의 D % d에 " , m, N);
8      INT의 합 = 0 ;
도 9      에 대해 ( int로 I = 0 ; I은 m이 <; ++ I)
 (10)          는 scanf ( " %의 D " , & A [I]);
(11)     위한 ( int로 I = 0 ; I <N은; ++ I)
 (12)          는 scanf ( " %의 D ' , 및 B [I]);
13      정렬 (A, A +의 m);
(14)      에 대한이 ( int로 I = 0 ; i가 N <; ++ I)
 15      {
 16           ( INT의 J = 0 ; J <m; ++ j)는
 17          {
 18              의 경우 (b [I] <= A [J])
 19              {
 20                  만약 (j의 == 0 ) 합계 = + A [ 0] - B의 [I];
21                  다른 합 + = 분 (ABS (A [J] - [I]), ABS (A, B [J - 1 ] - B [I]));
(22)                  휴식 ;
23              }
 24          }
 25      }
 26      의 printf ( " % D \ 없음 " , 합);
27      반환  0 ;
28 }

2. 이진 검색 최적화 O 100 점수 (N * (m) 로그)

각 후보의 i 번째 대학을 찾기 위해 이진 검색을 사용하여 검색 프로세스는 시간 복잡도의 큰 문제, 간단한 알고리즘 공감의 나머지 부분을 해결할 수있는 유일한 로그 (m) 시간을 필요로

1 #INCLUDE <cstdio>
 2 #INCLUDE <알고리즘>
 3  사용  스페이스 성병;
4  INT의 m, n은,이 [ 100010 ], B [ 100010 ];
5  INT ) (주
 6  {
 7      는 scanf ( " %의 D % d에 " , m, N);
8      INT의 합 = 0 ;
도 9      에 대해 ( int로 I = 0 ; I은 m이 <; ++ I)
 (10)          는 scanf ( " %의 D " , & A [I]);
(11)     위한 ( int로 I = 0 ; I <N은; ++ I)
 (12)          는 scanf ( " %의 D ' , 및 B [I]);
13      정렬 (A, A +의 m);
14       ( int로 = 1을 0 ; i가 N <; ++ I)
 15      {
 16          INT를 L = 0 , R = m - 1 ;
17 일          동안 (L < R)
 18          {
 19              INT 중간 = (L + R) / 2 ;
20              의 경우 (b의 [I]> = A [미드]) = L + 중간1 ;
(21)              그 밖의  경우 (b [I]가 <A [미드]) R = 미드;
(22)          }
 (23)          의 경우 (b [I] <= A [ 0 ]) 합계 + = A [ 0 ] - B [I];
24          다른 합 + = 분 (ABS (A [1 - (1) ] - B [I]), ABS (A [1] - B [I]));
25      }
 26      의 printf ( " % D \ 없음 " , 합);
27      반환  0 ;
28 }

추천

출처www.cnblogs.com/ZhangRunqi/p/11297431.html