[욕심, DP] 2019 중국어 대학생 프로그래밍 대회 (CCPC) - 네트워크 시험 낚시 마스터 (문제 - 6709)

주제 : 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는  당신을 받아들이고 말을하지 않습니다 "당신은 완료! 당신은 바보입니다!".

그래서 당신은 최적의 시간을 준비하면 시험을 통과하는 짧은 시간은 무엇인가?
 

 

입력
입력의 첫 번째 라인은 하나의 정수로 구성  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의시간 물고기.
 

 

산출
각 테스트 케이스에 대해서, 시험을 통과하는 최단 시간을 나타내는 하나 개의 광고에 하나의 정수를 출력한다.
 

 

샘플 입력
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 생선을 .
 

 

출처
 

 

권하다
liuyiding | 우리는주의 깊게 당신을 위해 몇 가지 유사한 문제를 선택 :   6712   6711   6710   6709   6708 

질문의 의미 :

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  * * /

 

추천

출처www.cnblogs.com/Railgun000/p/11403678.html