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

C++에서 모든 홀수 길이 하위 목록의 중앙값 합계를 찾는 프로그램


nums라는 숫자 목록이 있다고 가정하고 주어진 목록의 모든 홀수 길이 하위 목록의 중앙값 합계를 찾아야 합니다.

따라서 입력이 nums =[2, 4, 6, 3]과 같으면 홀수 길이의 하위 목록이 − [2], [4], [6], [3]이므로 출력은 23이 됩니다. [2, 4, 6], [4, 6, 3]이므로 중앙값의 합은 2 + 4 + 6 + 3 + 4 + 4 =23입니다.

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

  • ret :=0

  • initialize i :=0의 경우, i <숫자의 크기일 때 업데이트(i를 1만큼 증가), 수행 -

    • que_max

      라는 우선 순위 대기열을 정의합니다.
    • que_min

      이라는 다른 우선순위 큐를 정의하십시오.
    • 초기화 j :=i의 경우 j <숫자의 크기일 때 업데이트(j를 1만큼 증가), −

      • que_max

        에 nums[j]를 삽입합니다.
      • que_max의 크기>=2인 동안 −

        • que_max의 최상위 요소를 que_min에 삽입

        • que_max에서 최상위 요소 삭제

      • 동안(que_min의 크기가 0이 아니고 que_max의 상위 요소> que_min의 상위 요소), 수행 -

        • a :=que_max의 최상위 요소, que_max에서 최상위 요소 삭제

        • b :=que_min의 최상위 요소, que_min에서 최상위 요소 삭제

        • que_max에 b 삽입

        • que_min에 삽입

      • i mod 2가 j mod 2와 같으면 -

        • ret :=ret + que_max의 최상위 요소

  • 리턴 렛

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

예시

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int>& nums) {
   int ret = 0;
   for (int i = 0; i < nums.size(); i++) {
      priority_queue<int> que_max;
      priority_queue<int, vector<int>, greater<int>> que_min;
      for (int j = i; j < nums.size(); j++) {
         que_max.push(nums[j]);
         while (que_max.size() - que_min.size() >= 2) {
            que_min.push(que_max.top());
            que_max.pop();
         }
         while (que_min.size() && que_max.top() > que_min.top()) {
            int a = que_max.top();
            que_max.pop();
            int b = que_min.top();
            que_min.pop();
            que_max.push(b);
            que_min.push(a);
         }
         if (i % 2 == j % 2) {
            ret += que_max.top();
         }
      }
   }
   return ret;
}
int main(){
   vector<int> v = {2, 4, 6, 3};
   cout << solve(v);
}

입력

{2, 4, 6, 3}

출력

23