주제 : http://acm.hdu.edu.cn/showproblem.php?pid=6709
낚시 마스터
시간 제한 : 2000/1000 MS (자바 / 기타) 메모리 제한 : 65,536분의 65,536 K (자바 / 기타)
총 제출 (들) : 631 수락 제출 (들) : 170
문제 설명
그 들었다
전자 오 m는 낚시 마스터입니다, 당신은 당신의 멘토로 그를 인정하고 싶다. 모두가 아시다시피 당신은 MASTER의 제자가 될하려는 경우, 당신은 시험을 통과해야한다. 당신이 낚시 마스터 찾을 그래서 전자의 오 m을 , 재판은 다음과 같습니다
있다 n 개의 풀에서 물고기. 들어 그것의 시간 물고기, 적어도 얻어 t를 I (익히지이 가능) 스튜 분. 이 문제를 단순화하기 위해, 시간이 물고기는 잡기 보냈다 K의사록. 한 번에 물고기를 잡을 수있는 단 하나의 포트가 있기 때문에, 하나의 물고기는 한 번에 냄비에 끓인 할 수 있습니다. 당신이 물고기를 잡는 동안, 당신은 당신이 냄비에 잡은 원시 물고기를 넣을 수 없습니다, 그건 당신이 물고기를 잡기 시작하면, 당신은 때까지 중지 할 수 없음을 의미 케이 분 당신이 물고기를 잡는하지 않을 때, 당신은 (보다 적은 스튜 요리 물고기 걸릴 수 t의 난을 이 두 작업은 시간이 걸릴하지 남비) 또는 냄비에 생선을 넣어. 냄비에 끓인 물고기가 충분한 시간 동안 삶은되지 않은 경우, 당신이 그것을 꺼낼 수 없습니다,하지만 당신은 다른 물고기를 잡으려고 이동하거나 충분히 끓인 때까지 그냥 아무것도하지 않고 잠시 기다릴 수 있습니다.
이제 전자 오 m 그는 만족스러운 식사를 할 수 있도록 가능한 한 빨리 모든 물고기를 잡아 스튜 싶어 (당신은 확실히 물고기는 충분히 끓인 후 먹을 수 있다는 것을 알고). 당신이 짧은 시간에 그것을 완료 할 경우, 전자 오 m는 자신의 도제로 당신을 수락하고 말을 "나는 다있다! 나는 전체 해요!". 당신이 할 수없는 경우 전자 오 m는 당신을 받아들이고 말을하지 않습니다 "당신은 완료! 당신은 바보입니다!".
그래서 당신은 최적의 시간을 준비하면 시험을 통과하는 짧은 시간은 무엇인가?
있다 n 개의 풀에서 물고기. 들어 그것의 시간 물고기, 적어도 얻어 t를 I (익히지이 가능) 스튜 분. 이 문제를 단순화하기 위해, 시간이 물고기는 잡기 보냈다 K의사록. 한 번에 물고기를 잡을 수있는 단 하나의 포트가 있기 때문에, 하나의 물고기는 한 번에 냄비에 끓인 할 수 있습니다. 당신이 물고기를 잡는 동안, 당신은 당신이 냄비에 잡은 원시 물고기를 넣을 수 없습니다, 그건 당신이 물고기를 잡기 시작하면, 당신은 때까지 중지 할 수 없음을 의미 케이 분 당신이 물고기를 잡는하지 않을 때, 당신은 (보다 적은 스튜 요리 물고기 걸릴 수 t의 난을 이 두 작업은 시간이 걸릴하지 남비) 또는 냄비에 생선을 넣어. 냄비에 끓인 물고기가 충분한 시간 동안 삶은되지 않은 경우, 당신이 그것을 꺼낼 수 없습니다,하지만 당신은 다른 물고기를 잡으려고 이동하거나 충분히 끓인 때까지 그냥 아무것도하지 않고 잠시 기다릴 수 있습니다.
이제 전자 오 m 그는 만족스러운 식사를 할 수 있도록 가능한 한 빨리 모든 물고기를 잡아 스튜 싶어 (당신은 확실히 물고기는 충분히 끓인 후 먹을 수 있다는 것을 알고). 당신이 짧은 시간에 그것을 완료 할 경우, 전자 오 m는 자신의 도제로 당신을 수락하고 말을 "나는 다있다! 나는 전체 해요!". 당신이 할 수없는 경우 전자 오 m는 당신을 받아들이고 말을하지 않습니다 "당신은 완료! 당신은 바보입니다!".
그래서 당신은 최적의 시간을 준비하면 시험을 통과하는 짧은 시간은 무엇인가?
입력
입력의 첫 번째 라인은 하나의 정수로 구성
T ( 1 ≤ T ≤ 20 ) 테스트 케이스의 수를 나타내는.
테스트 케이스를 들어, 첫 번째 행은 두 정수 포함 N ( 1 ≤ N ≤ 10 (5) ) , K ( 1 ≤ K ≤ 10 9 ) 풀 물고기의 개수 및 물고기를 잡는 데 필요한 시간을 나타내는.
두 번째 행은 포함 된 N의 정수, t (1) , t (2) , ... ,T는 N ( 1 ≤의 t는 난 ≤ 10 9 ) 조리하는데 필요한 최소한의 시간을 나타내는, 저 - t의시간 물고기.
테스트 케이스를 들어, 첫 번째 행은 두 정수 포함 N ( 1 ≤ N ≤ 10 (5) ) , K ( 1 ≤ K ≤ 10 9 ) 풀 물고기의 개수 및 물고기를 잡는 데 필요한 시간을 나타내는.
두 번째 행은 포함 된 N의 정수, t (1) , t (2) , ... ,T는 N ( 1 ≤의 t는 난 ≤ 10 9 ) 조리하는데 필요한 최소한의 시간을 나타내는, 저 - t의시간 물고기.
산출
각 테스트 케이스에 대해서, 시험을 통과하는 최단 시간을 나타내는 하나 개의 광고에 하나의 정수를 출력한다.
샘플 입력
2 3 5 5 5 8 2 4 3 3
샘플 출력
(23) (11)
힌트
사례 1 : 3 물고기 (5 분) 캐치는, 1 번째 물고기를 넣어, 3 물고기를 꺼내 (3 분) 기다립니다 1 물고기 (5 분)을 잡기에 3 물고기를 넣어 (2 물고기를 잡는 5 분), 2 번째 물고기를 넣어, 1 물고기를 꺼내 (5 분 대기), 2 물고기를 꺼내. 사례 2 : 1 물고기 (4 분) 캐치는, (3 분) 기다린에서 2 물고기를 넣어, 1 물고기를 꺼내, 2 물고기 (4 분)를 잡아, 1 번째 물고기를 넣어 밖으로 2 생선을 .
출처
권하다
질문의 의미 :
N 물고기 적어도 난 분 (TI가 초과) TI 조림 물고기, 단지 K 분 물고기를 잡을 필요가 (K 분 이상 이하 나 이상의 분 K와 반 정지 될 수 없다)
물고기를 잡을 무제한 저장 될 수있다 물고기, 물고기 스튜하지만 각 시간과 (생선 스튜가 냄비 TI 분에 투입해야 후) 중간에 중지 할 수 없습니다, 당신은 낚시를 갈 수 즉시 (시간이 걸릴하지 않음) 할 수있는 좋은 생선 스튜 후 생선 스튜에서 대기 생선이나 생선에 와서는
이러한 생선 스튜 마무리를 잡아 분의 최소 숫자가 걸리는 완료하도록 요청
아이디어 :
다만 K + Σti ANS =입니다 물고기, 생선 스튜에 나머지 시간을 잡기 위해 여분의 시간을 보내고, 이상적인 상황을 고려,이 활용할 수있는 시간이며, 그는 Dunyu 때 때문에 낚시 가능한 생선의 수마다 Dunyu [TI / K]을 잡기에
이 타임 Σ의 존재하지만 [TI / K] <N-1, 여기서 (N-1 처음 잡이되었으므로 모든 물고기를 잡을 수없는 생선 스튜 완료되면 물고기), 즉,이 최소의 합을하기 위해 시간의 낭비, 시간 낭비가 발생합니다, 우리는 필요
최소한 지금 때마다 낭비되는 시간이 얼마나 파악 당신은 생선 스튜 [TI / K] 물고기를 잡을 수 있지만, 시간에 대한 모든 오퍼를 다시 사용할 수 있습니다 때 생선 스튜 마감 시간에있는 모든 물고기를 잡을 수 없어 지금 TI % K의 시간을 기다려야하지만, 필요, 우리는 또한 잡을 필요 = N-1-Σ [필요 TI / K] 물고기,
낚시를하기 위해 추가 시간을 보내는 것을 고려하는 지금 시간이 걸릴 당신이 보낼 수있는 여분의 시간 K의 필요성을 * 낚시를하거나, TI % K 시간을 기다려야 할 때 일부 생선 스튜 물고기가 분 K와 중지 할 수 필요가 있기 때문에, 낚시를,하지만 지금은 시간이 TI % Dunyu이 중지됩니다 K, 그래서 우리는 K-TI 때 Dunyu %의 k를 낭비 계속 할 필요가
K> K-TI % k를 찾을 수 있습니다, 표시 그런 다음 해당 프로그램 나은, 그래서 우리는 물고기를 잡기 위해 추가로 필요를 필요로하는 경우, 당신은이-TI 유아원 % k는 낭비가는 것을 선택, 단순히 좋은 순서 후 앞줄 최종 ANS 추가 시간 낭비를 필요로 시간 낭비 작은 필요 출력 ANS 잘
이 샘플 질문 중 게임 :
입력:
1
3 500
999 20 20
산출:
1,540
1 #INCLUDE <. 비트 / stdc ++ H> 2 사용 스페이스 성병; 3 CONST의 INT의 AMN 1E5 + = 5 ; 4 의 INT t [AMN, 폐기물 [AMN]; 5 INT 의 main () { 6 // COUT << 500- (9백99퍼센트 500); 7 INT T, N, K; 8 긴 긴 ANS, cancatch; 도 9 는 scanf ( " %의 D ' , T); 10 동안 (T-- ) { 11 는 scanf ( " %의 D % d에 " , N, K); (12) = 된 ANS 케이; cancatch = 0 ; /// 0 물고기를 잡는 분 써야 제 K, 총 시간 k로 초기화된다 Dunyu 피싱 시간 초기에 13이기 위해 ( int로 I = 0 ; I <N-; I ++ ) { 14 는 scanf ( " %의 D " , 및 T [I]); 15 ANS = + [I] T; /// 총 시간을 더한 시간 Dunyu 16 cancatch = T + [I] / K] /// 스튜 물고기 낚시 시간 T = + [I]의 수 / K 17. 폐기물 [I] = KT [I] %의 K; /// KT = [I] K %의 각 시간을 낭비 18이다 } . 19 IF (cancatch <N- . 1 ) { ///물고기가 완전히 꺼 Dunyu 부시가 아닌 경우 (20)는 INT의 필요성 = N- . 1 -cancatch; /// 또한 물고기 잡을 필요가 필요 21은 , 정렬 (폐, N- 폐기물 +) /// 시간의 낭비를 분류하기 전, 복용 전체 시간에 추가 시간의 작은 낭비해야 22 인 를 들어 ( int로 = I를 0 ; I가 필요 <; I는 ++) ANS + = ; 폐기물 [I]는 23이다 } 24 의 printf (을 " % LLD의 \의 N- " , ANS) (25) } (26)이다 } 27 / * * 28 N-생선 고기는 적어도 I 분 (TI가 초과), 단지 K 분 물고기를 잡을 필요가 (K 분 이상 이하 나 이상의 분 K와 반을 중지 할 수있다) TI 조림 29 단지 무제한 고기, 생선 스튜 있지만, 각 시간을 유지할 수 있습니다 물고기를 잡아와 (생선 스튜가 냄비 TI 분에 투입해야 후) 중간에 중지 할 수 없습니다, 당신이 낚시를하거나 생선 스튜에서 기다릴 수, 생선 스튜 직후 좋은 될 수 있습니다 에 생선이나 생선을 마련하기 위해 (시간이 걸릴하지 않습니다) (30)는 이 물고기가 완성 스튜 잡을하도록 요청하고 최소 소요 시간 (분)을 완료 (31) (32) 물고기, 나머지 시간을 잡으려고, 그냥 여분의 시간을 이상적인 지출을 고려 경우를 Dunyu이 사용된다, 즉 ANS = K + Σti, 그것은 낚시 시간 Dunyu 수 있기 때문에, 사용 가능한 생선의 수마다 Dunyu를 [TI / K] 잡을 이때 활용하는, 33 이번에 Σ [TI / K]의 존재 <N-1, 여기서 (N-1이 처음 물고기 잡기 때문에), 끓인 생선 즉 모든 어획량이 완료 할 수없는 경우, 그 다음 이것을 최소의 합을하기 위해 시간의 낭비, 시간 낭비가 발생합니다, 우리는 필요로 (34)를 각각의 시간을 낭비 얼마나 많은 시간을 알아 적어도, 지금은 생선 스튜 [TI / K] 물고기를 잡을 수 있지만, 재사용 할 수 없습니다 때 Dunyu 시간에, 또한 TI % K 대기 시간, 그러나 시간의 모든 생선 조림 어획량의 끝뿐만 아니라 잡으려고 = N-1-Σ [필요 TI / K] 물고기, 35 지금 테스트 계정으로 낚시를 갈 수있는 여분의 시간을하려면 TI % * k는 지금 낚시를하거나, TI % K 대기 시간 낚시를 할 때 낚시 K 분을 필요로하고 중지 할 수 없기 때문에 일부 생선 스튜 걸릴 때,하지만 여분의 시간의 필요성을 보낼 수 있습니다 모든 혜택은 K 시간 후 중지됩니다, 그래서 케이 %, 때 우리는 K-TI Dunyu을 낭비 계속해야 할 36 찾을 수 있습니다 K> 우리가 추가로 조각을 잡을 필요가 필요가 그래서 만약 K-TI %의 k는, 후자의 방식은 분명히 더 낫다 물고기 선거 전에 필요한 작은 K-TI % K와 같은 최종 출력 ANS의 ANS의 필요성 시간 정렬 된 폐기물 앞줄위한 시간 낭비 인 낭비 이동 37 38는 이 샘플에 나타내는 게임 문제 : 39 입력 : 40 41 1 42 3 500 43 999 20 20 44 45 출력 : 46 47 1,540 48 49 * * /