POJ 2431 원정 욕심 우선 순위 큐

원정
시간 제한 :  1000MS   메모리 제한 :  65536k 나
총 제출 :  30702   허용 :  8457

기술

암소의 그룹은 트럭을 잡고 정글로 탐험의 깊이에 모험. 오히려 가난한 드라이버이기 때문에, 소는 불행하게도 바위를 통해 실행하고 트럭의 연료 탱크에 구멍을 할 수 있었다. 트럭은 이제 연료의 하나 개의 유닛은 이동 거리의 모든 단위 누수. 

트럭을 복구하려면, 소는 긴, 굴곡 도로 아래로 가장 가까운 도시 (더 이상 1,000,000 대 이상 먼) 운전해야합니다. 이도에 도시 및 트럭의 현재 위치 사이의 소 추가 연료 (각 정류장에서 1..100 단위) 취득을 중지 할 수있는 N (1 <= N <= 10000) 연료 정지있다. 

정글은 인간의 위험한 소에 특히 위험하다. 따라서, 소 마을로가는 길에 연료 정지의 가능한 최소 수를 만들고 싶어. 다행히, 자신의 트럭에 연료 탱크의 용량은 효과적으로 저장할 수있는 연료의 양에 제한이 없음을 너무 큽니다. 트럭은 떨어진 거리에서 L 단위이고, P 연료의 단위를 갖는다 (1 <= P <= 100). 

소가 전혀 마을에 도달 할 수없는 경우 마을에 도달하거나 필요한 정지의 최소 번호를 확인합니다. 

입력

* 라인 1 : 하나의 정수이고, N 

* 라인 2..N + 1 : 각 라인은 연료 정지를 설명하는 두 개의 공간 분리 된 정수를 포함 제 정수가 정지 도시의 거리이고; 두 번째는 그 정지시 연료의 사용 가능한 양이다. 

* 라인 N + 2 개의 공간으로 분리 정수, L 및 P

산출

* 라인 1 : 연료의 최소 수를 나타내는 하나의 정수 마을에 도달하기 위해 필요한 중지합니다. 이 마을에 도달 할 수없는 경우, 출력 -1.

샘플 입력

4 
4 4 
5 2 
11 5 
15 10 
25 10

샘플 출력

힌트

INPUT 자세한 사항 : 

트럭은 25 개 단위 떨어진 마을에서이다; 트럭은 연료의 10 개 단위를 가지고있다. 길을 따라, 연료 (4) 거리 (4, 5), (11)이 정지하고, 도시 15 (이러한 초기 거리 21, 20, 14로되어 있으므로, 트럭 및 10)이있다. 이 연료 정지 각각 연료의 최대 4, 2, 5, 10 유닛을 제공 할 수 있습니다. 

출력 세부 사항 : 

드라이브 10 단위 취득 (10)의 연료 이상의 유닛을 정지, 4 개 단위 취득 연료의 5 개 단위 정지 드라이브, 다음 마을에 드라이브.

출처

 
1 #INCLUDE <cstdio>
 2 #INCLUDE <iostream>
 3 #INCLUDE <큐>
 4 #INCLUDE <알고리즘>
 5  
6  이용한  스페이스 성병;
7  
8  CONST  INT max_n 1E4 + = 2 ;
9  CONST  INT max_L = 1E6;
10  CONST  INT max_P = 1E6;
11  CONST  INT max_A = max_L;
12  CONST의  INT max_B = 100 ;
13  
(14)  INT N, L, P;
(15) INT A [max_n], B [max_n]
 16  
. 17 typedef에 구조체 노드
 (18)는  {
 . 19      INT에서 , A, B
 (20)이다  };
 (21)는  노드 노드 [max_n]
 (22)이  
23 인  
24  BOOL CMP (노드 A, 노드 B)가
 25  {
 26은      리턴 AA < BA,
 27  }
 28  
29  공극 (해결)
 30  {
 31 인      // 편의상 단말 국으로 알 수있는 
32 개의      노드 [N-] II.A = L;
 33은      노드 [N-] .B = 0 ;
 34이다      ++N-]
 35  
36      // 배열 간격으로 정렬
 37      @ 미친 WA I 정렬하지 않아도, 백서 날 해칠 
38 인      정렬 (노드, 노드 + N-, CMP),
 39  
(40)  //     (INT I = 0; I <N-; I ++)
 41 인  //     {
 42된다  //         COUT << 노드 [I]를 II.A << '<< 노드 [I]를 .B << ENDL;
 43이다  //     } 
44 인  
45      INT ANS = 0 ;
 (46)이된다  
(47)      // 오일 최대 우선 순위 큐가 저장 위치에 도달 할 수있는 규정 
48      priority_queue < INT > 힙;
 49  
(50)      에 대한 ( INT I =0 ; I <N-; ++ I)
 (51)가      {
 52 인          // 루프 밖으로 단부 현재까지, 
53되는          IF (P> = L)
 (54)는          {
 55              BREAK ;
 56이다          }
 (57)이다          // 현재 도달 지점 
58          그동안 <(P 노드 [I] II.A)
 59          {
 60              //이 급유 또는까지 비워 
61은              IF (heap.empty ())
 (62)가              {
 63 인                  박았 ( " -1 " )
 64                  리턴 ;
 65              }
 66             ++ ANS,
 67              P = + heap.top ();
 68              heap.pop ();
 69          }
 70  
71이다          // 현재 지점이 지점까지의 스택에 추가 된 
72          heap.push (노드 [I] .B)를,
 73은      }
 74  
75      의 printf ( " % D \ N- " , ANS);
 76  }
 77  
78  INT 주 ()
 79  {
 80      는 scanf ( " %의 D " , 및 N-)
 81      INT DIS 연료,
 82       ( INT난 = 0 ; I <N; ++ I)
 83      {
 84          는 scanf ( " % D % D " , DIS, 연료);
85          노드 [I] = .A DIS;
86          노드 [I] = .B 연료;
(87)      }
 (88)  
(89)      는 scanf ( " % D % D ' , L, P);
90  
91       ( INT 난 = 0 ; i가 <N; ++ I)
 92      {
 93          노드 [I] = .A L- 노드 [I] .A;
94      }
 95      ) (해결;
96      반환  0 ;
97 }

 

 

추천

출처www.cnblogs.com/jishuren/p/12264510.html