제목 설명
농부 존은 새로운 소가 필요합니다! 이 판매 N 소 (1 <= N <= 50,000)이며, FJ 돈의 M 단위의 자신의 예산 (1 <= M <= 10 ^ 14)보다 더 많은 지출을하지해야합니다. 암소 나 P_i 돈 (1 <= P_i <= 10 ^ 9) 들지만 FJ는 K 쿠폰 (1 <= K <= N)를 가지며, 그 소 i에서 쿠폰을 사용하는 경우, 소 <(1 대신 C_I 비용 C_I = <= P_i). FJ는 물론, 소 당 하나 개의 쿠폰을 사용할 수 있습니다.
FJ이 감당할 수있는 젖소의 최대 수는 무엇입니까?
시장 N (1 <= N <= 50000)에 새로운 소, 소 살 FJ 준비 i 번째 소의 가격 파이 (1 <= 파이 <= 10 ^ 9). 소 쿠폰은 한 번만 사용할 수 있습니다 당이 FJ K 쿠폰,는 i 소 가격을 구입하는 쿠폰을 사용하여, CI (1 <= CI <= 파이를) 떨어졌다. FJ 궁금 M보다 더 많은 지출을하지 (1 <= M <= 10 ^ 14) 젖소의 최대 수를 살 수있는 돈?
입력 및 출력 형식
입력 형식 :
* 라인 1 : 세 개의 공간 분리 된 정수 : N, K, 및 M.
* 라인 2..N + 1 : P_i 및 C_I : 라인 전 + 1은 두 개의 정수가 포함되어 있습니다.
출력 형식 :
* 1 호선 : 하나의 정수, FJ이 감당할 수있는 젖소의 최대 수.
샘플 입출력
설명
FJ 4 개 소, 1 개 쿠폰, 7의 예산을 가지고 있습니다.
FJ 3 + 2 + 1 = 6의 총 비용, 암소 3 쿠폰을 사용하고, 소 (1, 2)을 구입하고, 3.
분석 :
이 질문은이 질문의 제목을 기반으로 알고리즘을 제공하는 것이 더 어렵다, 그러나 어렵지 않다 : 탐욕과 힙, 그래서이 문제는 테스트 프로그램의 기능입니다 문제 알고리즘을 달성하는 것입니다.
암호:
1 #INCLUDE <cstdio> 2 #INCLUDE <CString을> 3 #INCLUDE <cmath> 4 #INCLUDE <iostream> 5 #INCLUDE <알고리즘> 6 #INCLUDE <큐> 7 #DEFINE M 1,000,000 8 사용 스페이스 성병; 9 INT N, K, ANS, [M]으로; 10 긴 긴 m; 11 INT의 판독 () { 12 문자 C = getchar가 (); INT ANS = 0 ; 13 일 동안 (c < ' 0 ' || C> ' 9' ) C = getchar가 (); 14 일 동안 (c> = ' 0 ' && C <= ' 9 ' ) = ANS (ANS << 1 ) + (ANS << 3 ) + (C ^ 48 ) = C getchar가 (); 15 리턴 ANS; 16 } 17 구조체 노드 { 18 INT X, Y, ID; 19 } A [M], B [M], C [M]; 20 부울 CMP1 (노드 U가 노드 V) { 복귀 UY < VY} 21 부울 CMP2 (노드 U, V는 노드) { 반환 UX < VX를} 22 부울 CMP3 (노드는 U, 노드 V) { 반환 UX-UY <VX- VY를} 23 INT 의 main () { 24 , N =) (읽기, K 판독 = ();는 scanf ( " %의 LLD를 " , m); (25) 에 대한이 ( int로 I = 1 ; i가 = N <; ++ ⅰ) [I] .x를 = B를 [I] .x를 = C를 [I] .x를가 (판독 =)와, [I]가 .Y = B를 [I] .Y = C [i]를 .Y = A [I] = .ID의 B) (읽기 [I]의 .ID = C [i]를 .ID = I; 26 정렬 (A + 1 , A + 1 + N, CMP1) 정렬 (B + 1 , B + 1 + N, CMP2) 정렬 (c + 1 , C + 1 + N, CMP3); 27 대 ( int로 I =1 ; K = 난을 <; ++ I) { 28 일 경우 (m <A [i]를 .Y) {의 printf ( " %의 D " , ANS); 반환 0 } 29 M- = A [i]를 .Y; ++ ANS] 내지 [A [i]를 .ID] = 1 ; 30 } 31 INT now_a = K + 1 , now_b = 1 , now_c = 1 ; 32 하면서 (발 [now_b] .ID B]) ++ now_b; 33 하면서 (발 [now_c] C .ID]!) ++ now_c; 34 동안 (ANS < N) { 35 INT tmp1 = B [now_b] .x와, tmp2 = C [now_c] .xc [now_c] .Y + A [now_a] .Y; 36 의 경우 (m <tmp1 && m <tmp2) 체류 ; 37 ++ ANS; 38 의 경우 (tmp1 <tmp2) M- = B [now_b] .x를로 [. B [now_b ++] ID = 1 ; 39 다른 m - = (c [now_c] .xc [now_c] .Y + A [now_a] .Y) now_c ++ [C [now_c ++] ID.] = 행 1 ; 40 동안 (now_b <= N &&에 [now_b] .ID B]) ++ now_b; 41 동안 (now_c <= N && 내지 [C [now_c] .ID]!) ++ now_c; 42 } 43 의 printf ( " %의 D " , ANS); 44 반환 0 ; 45 }