[USACO12FEB] 牛 券 암소 쿠폰

제목 설명

농부 존은 새로운 소가 필요합니다! 이 판매 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이 감당할 수있는 젖소의 최대 수.

 

샘플 입출력

입력 샘플 # 1 : 
4 1 7 
3 2 
2 2 
8 1 
4 3
출력 샘플 # 1 : 

설명

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 }

 

추천

출처www.cnblogs.com/kanchuang/p/11116494.html