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

하우스 메이킹으로 최대의 이익을 얻는 C++ 코드

<시간/>

두 개의 숫자 n과 h와 T[i] =(li, ri, xi)인 m개의 삼중항 T의 또 다른 배열이 있다고 가정합니다. 길 위에 집을 지을 수 있는 곳은 n곳입니다. 반점은 1에서 n으로 번호가 매겨집니다. 집 높이는 0에서 h까지일 수 있습니다. 각 지점에서 높이가 k인 집을 만들면 k^2만큼의 돈을 얻게 됩니다. m 영역 제한이 있습니다. i 번째 제한 사항은 다음과 같습니다. 지점 li에서 ri까지의 가장 높은 집은 기껏해야 xi여야 합니다. 우리는 우리의 이익을 극대화하기 위해 집을 만들고 싶습니다. 우리는 우리가 만들 수 있는 최대한의 이익을 찾아야 합니다. 우리는 최대의 이익을 찾아야 합니다.

따라서 입력이 n =3과 같으면; h =3; T =[[1,1,1],[2,2,3],[3,3,2]], 출력은 14가 됩니다. 왜냐하면 집이 3개 있고 최대 높이가 3이기 때문입니다. 첫 번째 제한은 1과 1 사이의 가장 높은 집이므로 최대 1이어야 합니다. 두 번째 제한에서 2와 2 사이의 가장 높은 집은 최대 3이어야 합니다. 마찬가지로 세 번째 제한에서 3과 3 사이의 가장 높은 집은 최대 2여야 합니다. 따라서 최적의 높이는 [1,3,2]입니다. 따라서 1^2 + 3^2 + 2^2 =14입니다.

단계

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

m := size of T
Define an array heights n and fill with h
for initialize i := 0, when i < m, update (increase i by 1), do:
   l := T[i, 0]
   r := T[i, 1]
   h := T[i, 2]
   for initialize i := l - 1, when i < r, update (increase i by 1), do:
      heights[i] := minimum of heights[i] and h
ans := 0
for initialize i := 0, when i < n, update (increase i by 1), do:
   ans := ans + heights[i] * heights[i]
return ans

예시

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

#include <bits/stdc++.h>
using namespace std;
int solve(int n, int h, vector<vector<int>> T){
   int l, r;
   int m = T.size();
   vector<int> heights(n, h);
   for (int i = 0; i < m; i++){
      l = T[i][0];
      r = T[i][1];
      h = T[i][2];
      for (int i = l - 1; i < r; i++)
      heights[i] = min(heights[i], h);
   }
   int ans = 0;
   for (int i = 0; i < n; i++)
   ans += heights[i] * heights[i];
   return ans;
}
int main(){
   int n = 3;
   int h = 3;
   vector<vector<int>> T = { { 1, 1, 1 }, { 2, 2, 3 }, { 3, 3, 2 } };
   cout << solve(n, h, T) << endl;
}

입력

3, 3, { { 1, 1, 1 }, { 2, 2, 3 }, { 3, 3, 2 } }

출력

14