Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 함수 회전

<시간/>

정수 배열 A가 주어졌다고 가정하고 n을 배열 A의 길이라고 하자. 이제 Bk가 배열 A, k 위치를 시계 방향으로 회전하여 얻은 배열이라고 가정합니다. 여기서 회전은 다음과 같이 정의할 수 있습니다. -

  • F(k) =0 * Bk[0] + 1 * Bk[1] + ... + (n-1) * Bk[n-1].

이제 F(0), F(1), ..., F(n-1)의 최대값을 찾으십시오.

따라서 입력이 A =[4,3,2,6]과 같으면 -

  • F(0) =(0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) =0 + 3 + 4 + 18 =25

  • F(1) =(0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) =0 + 4 + 6 + 6 =16

  • F(2) =(0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) =0 + 6 + 8 + 9 =23

  • F(3) =(0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) =0 + 2 + 12 + 12 =26

최대값은 26입니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • n :=배열 A의 크기, n이 0이면 0을 반환

  • ret :=0, 크기가 n인 배열 두 개를 만듭니다. 이 배열은 오른쪽과 왼쪽입니다.

  • 왼쪽[0] :=A[0]

  • 범위 1에서 n – 1까지의 i에 대해

    • 왼쪽[i] :=왼쪽[i] + 왼쪽[i – 1]

    • 왼쪽[i] :=왼쪽[i] + A[i]

  • 오른쪽[n – 1] :=A[n – 1]

  • 범위 n – 1에서 0까지의 i에 대해

    • 오른쪽[i] :=오른쪽[i] + 오른쪽[i + 1]

    • 오른쪽[i] :=오른쪽[i] + A[i]

  • rightMul :=0, cnt :=n – 1

  • 범위 n – 1에서 1까지의 i에 대해

    • rightMul :=rightMul + A[i] * cnt

    • cnt 1 감소

  • 크기가 n인 배열 x 만들기

  • 0 ~ n – 2 범위의 i에 대해

    • x[i] :=rightMul

    • rightMul :=rightMul – 오른쪽[i + 1]

  • leftMul :=0, cnt :=1

  • 범위 0에서 n – 2까지의 i에 대해

    • leftMul :=leftMul + A[i] * cnt

    • cnt 1 증가

  • cnt 1 감소

  • 범위 n – 1에서 1까지의 i에 대해

    • x[i] :=x[i] + leftMul

    • leftMul :=leftMul – A[i – 1] * cnt

    • i – 2>=0이면 leftMul :=leftMul + left[i – 2]

  • x의 최대값을 반환합니다.

예시(C++)

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   int maxRotateFunction(vector<int>& A) {
      lli n = A.size();
      if(n == 0) return 0;
      lli ret = 0;
      vector <lli>right(n);
      vector <lli> left(n);
      left[0] = A[0];
      for(lli i = 1; i < n; i++){
         left[i] += left[i - 1];
         left[i] += A[i];
      }
      right[n - 1] = A[n - 1];
      for(lli i = n - 2; i >= 0; i--){
         right[i] += right[i + 1];
         right[i] += A[i];
      }
      lli rightMul = 0;
      lli cnt = n - 1;
      for(lli i = n - 1; i > 0; i--){
         rightMul += (A[i] * cnt);
         cnt--;
      }
      vector <lli> x(n);
      for(lli i = 0; i < n - 1; i++){
         x[i] = rightMul;
         rightMul -= right[i + 1];
      }
      lli leftMul = 0;
      cnt = 1;
      for(lli i = 0; i < n - 1; i++){
         leftMul += A[i] * cnt;
         cnt++;
      }
      cnt--;
      for(lli i = n - 1; i >= 1; i--){
         x[i] += leftMul;
         leftMul -= (A[i - 1] * cnt);
         if(i - 2 >= 0) leftMul += left[i - 2];
      }
      ret = INT_MIN;
      for(lli i = 0; i < x.size(); i++) ret = max(ret, x[i]);
      return ret;
   }
};
main(){
   Solution ob;
   vector<int> v = {4,3,2,6};
   cout <<(ob.maxRotateFunction(v));
}

입력

[4,3,2,6]

출력

26