[제목] 효과
$ m의 $ 작업, 작업 $이 있습니다 내가 $ 등급 $의 y_i의 $는 $ x_i로부터 $에 대한 작업을 완료하는 데 필요한 시간, $ (500) * x_i로부터 + 2 * y_i의 $의 소득. 더 이상 작업보다 기계 수준 또는 기계 시간보다 작업 수준이 기계를 사용할 수없는 경우가 $ $ N-기계는 첫 번째 레벨 I $ $ $ y_i 기계는, $ x_i로부터의 $ 긴 작업 시간 $입니다 작업을 완료합니다. 기계는 작업은 많은 작업을 추구하고 최대의 이익을 얻을까지 완료 할 수있는 방법을 기계에 수행 할 수 있습니다, 작업을 완료 할 수 있습니다.
[분석] 아이디어
이러한 욕심이 문제는 분명하지만, 소득 시간의 큰 비율, 그래서 첫 번째 키워드로 키워드 순위를 시간을 고려하기 때문에 작업에 두 번째, 조금 어렵게 생각하고 기계가 내려졌지만 정렬. 그런 다음 각 작업, 기계의 조건을 충족하는 각 레코드 시간을 열거 한 다음 기계의 조건을 만족하고 소득 수준을 계산하는 데 큰 작은 찾습니다.
[] 코드 구현
1 #INCLUDE <cstdio> 2 #INCLUDE <iostream> 3 #INCLUDE <알고리즘> 4 #INCLUDE <CString을> 5 #DEFINE RG 등록 6 #DEFINE의 (나, a가, b) (RG의 인터넷 용 난 = 이동; 나는 < = B; 내가 ++) 7 #DEFINE가 긴 긴 것이다 8 사용 스페이스 성병; 9 CONST의 INT의 N = 100,002 ; 10 INT의 N, m, NUM [ 102 ] ans1; 11 게요 ans2; 12 구조체 기계 { 13 INT의 X, Y; 14 } A [N], 2 [N]; (15) 부울 CMP (시스템 A, 컴퓨터 B) { 16 일 경우 (도끼 = Bx로!) 복귀 도끼> Bx로; 17 창 불안> 단계; 18 } 19 INT 의 main () { 20 동안 (는 scanf ( " %의 D % d에 " , N, m)! = EOF) { 21 이동 (I, 1 , N)는 scanf ( " % d 개 %의 D ' , A [I ] .x를, & A [i]를 .Y); 22 이동 (I, 1 , m)는 scanf ( " % d 개 %의 D ' , 및 B [I] .x를, B의 [I] .Y); 23 정렬 (a + 1, A + . 1 + N-, CMP), 정렬 방법 (B의 + . 1 , B의 + . 1 + m, CMP), (24) INT J = . 1 , 25 이동 (I, . 1 , m) { 26은 그동안 (J <= N - && A [J] .x를 > = B가 [I]는 .x를) NUM [A [J] .Y] ++, J는 ++ ; 27 // 기록 시스템의 시간 조건을 만족 28 이동 (K, B가 [I] .Y, 100 ) (29) IF (NUM [K]) { // 검색 시스템 레벨이 조건을 만족 30 NUM [K] -; ANS1 ++; ANS2 + = 500 * B가 [I]를 .x를 + 2 *의 [I]를 .Y B; 31은 BREAK ; 32 } 33 } 34 의 printf ( " %의 D %의 LLD \ 없음 " , ans1, ans2); 35 ans1 = ans2 = 0 ; memset 함수 (NUM, 0 , 는 sizeof (NUM)); 36 } 37 반환 0 ; 38 }