"가능한 한 작은 최대"매우 일반적인 최적화 목표입니다.
책에 관한 튀김.
이 주제를보고 :
http://poj.org/problem?id=1505
다음과 같이 코드의 내 사본은 다음과 같습니다
사용법 #include <iostream> #INCLUDE <cstdio> #INCLUDE <CString을> 사용 스페이스 성병; INT 책 [505]; 부울 플래그 [505]; INT의 m, K; // m : 책의 수 K : 스크 라이버의 수. INT의 CNT; // CNT 카운트의 약자입니다. INT 사본 (긴 길이 X) { CNT = 1; 긴 긴 합 = 0; memset 함수 (플래그는 false를 sizeof (플래그)); 대해 (ⅰ =에게의 m-1에서 INT; I> = 0; 난 ...) { 합계 = + 책 [I]; SUM (> X)의 경우 { CNT ++; 합 = 책 [I]; 플래그 [I]는 = 참; } } CNT를 반환; } 무효 인쇄 () { 의 printf ( "%의 D"책 [0]); 경우 (; 나는 m <I는 I = 1 ++ INT) { 경우 (플래그 [I-1])의 printf ( "/")하는 단계; 의 printf ( "%의 D"책 [I]); } 의 printf ( "\ n")를; } INT의 main () { INT의 T; scanf와 ( "%의 D ', T); 긴 길이 (L), (R); (T--) 동안 { 는 scanf ( "%의 D % d에", m, k)를; L = R = 0; 경우 (; 나는 m <I는 I = 0 ++ INT) { 는 scanf ( "%의 D", 책 [I]); (도서 [I]> l)의 경우 L = 책 [I]; R + = 책 [I]; } 오래 오래 중반을; 중간 = (L +에서의 R) / 2; (복사 (MID) <= K)는 R = 미드 경우; 다른 중간 L = + 1; } INT의 CNT = 복사 (R); 경우 (; && 내가 해요 <CNT를 <K, I = 0 int로 난 ++) { 만약 플래그 [I] = TRUE, CNT ++ (플래그 [I]!); } 인쇄 (); } 0을 반환; }