牛 아름다운 가치를 -Maximize 客

https://ac.nowcoder.com/acm/contest/5086/A

일반적으로 문제의 의미 A가 [I]은, [I] ΣA로 계산 * 나, 피사체가 [I + K]를 필요 어레이가 이전에는 [I + K로 [I]를 난을 위치로 전환하고, -1 다음 유닛을 이동하고 최대 합을 찾고, 계산.

아이디어 : 직접적인 폭력의 시작,하지만 때마다 플러스에서는 제한 시간이됩니다. (폭력) 및 프리픽스는 프리픽스를 사용하므로, 및 [I]에서 [I + K-1]의 간격, ΣA 및 [I]의 시작 * 난 다음에, 인을 사용하고 요구 간격을 변경된 저장 계산    t는 = 최대 (t, ANS + A [I + K * IA [I + K * (I + K) + 합 [I + K-1] -sum [I-1])

요약하면, 그것은 사용을 최적화하기 위해 효율적으로 너무 큰의 복잡한 문제를 해결할 수있는 접두사와 다수의 방문입니다.

다음은 AC 코드입니다 :

 

사용법 #include <iostream> 
#INCLUDE <cstdio> 
#INCLUDE <알고리즘>  
#INCLUDE <CString을>
 사용  공간을 성병;
  합 [ 100100 ]이 [ 100100 ];
값 int ) (주 {
     INT t 단계; 
    scanf와 ( " %의 D " , t);
    반면 (t-- ) {
          길이 N, K, ANS = 0 ; 
        memset 함수 (합계 0 , 는 sizeof (합)); 
        는 scanf ( " % LLD % LLD ", N, K);
        위한 ( INT 난 = 1 ; I <= N; I ++ ) { 
            는 scanf ( " %의 LLD " , & A [I]); 
            합 [I] + = 합 [I- 1 ] + A [I]; 
            ANS + = A [i]는 * I; 
        } 
         길이 t = - 1 ;
        위한 ( INT 난 = 1 ; I <= NK I ++ ) { 
            t = 최대 (t, ANS + A [I + K * IA [I + K * (I + K) + 합 [I + K- 1 ] -sum [I- 1 ]); 
        } 
        의 printf (" %의 LLD \ n " , t); 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/xinpingqihe/p/12663605.html