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

C++에서 주어진 연산을 사용하여 배열을 단일 정수로 줄입니다.

<시간/>

입력으로 정수 변수 Number가 제공됩니다. 임의의 순서로 1에서 Number 범위의 요소를 포함하는 배열을 생각해 보겠습니다. 다음과 같은 배열에 대해 Number-1 작업을 수행하면

  • 배열에서 두 개의 요소 A와 B를 선택합니다.

  • 배열에서 A와 B 제거

  • A와 B의 제곱합을 배열에 더합니다.

결국에는 단일 정수 값을 얻게 됩니다. 목표는 해당 요소에 대해 가능한 최대값을 찾는 것입니다.

우선순위 대기열 사용

  • 최종 결과를 최대화하려면 A와 B가 최대가 되도록 선택해야 합니다.

  • 최대 A와 B를 찾기 위해 우선 순위 대기열을 사용하여 그 안에 요소 값을 저장합니다.

  • 우선순위 큐는 요소를 내림차순으로 저장합니다.

  • 최상위 요소는 값이 가장 큽니다. 따라서 두 요소를 팝한 후 해당 사각형을 다시 대기열로 푸시합니다.

  • 원하는 결과를 얻으려면 숫자 - 1번을 누르고 누릅니다.

예시

입력 − 숫자=2

출력 − 배열 축소 후 단일 요소:5

설명 − 배열에 [ 1 2]

와 같은 요소가 있다고 가정합니다.

Priority Queue에 삽입 후-:2 1

A=5, B=4 :A 2 +B 2 =1+4=5

마지막 요소:5

입력 - 숫자=5

출력 − 배열 축소 후 단일 요소:5

설명 − 배열에 [ 5 1 2 4 3]

요소가 있다고 가정합니다.

Priority Queue에 삽입 후-:5 4 3 2 1

A=5, B=4 :A 2 +B 2 =25+16=41 :41 3 2 1

A=41, B=3 :A 2 +B 2 =1681+9=1690 :1690 2 1

A=1690, B=2 :A 2 +B 2 =1681+4=2856104 :2856104 1

A=2856104 , B=1 :A 2 +B 2 =1187163712+1=1187163713 :1187163713

마지막 요소 :1187163713

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

이 접근 방식에서 우리는 배열의 요소를 내림차순으로 저장하기 위해 대기열의 우선 순위를 지정할 것입니다. 상위 두 개의 가장 큰 요소를 팝하고 두 요소의 제곱합을 해당 대기열에 다시 푸시합니다. 값이 하나만 남을 때까지 이 작업을 수행합니다.

  • 입력 변수 번호를 가져옵니다.

  • 결과에 대한 데이터 유형을 긴 정수로 사용 - lli

  • reduceArray(int Num) 함수는 입력된 숫자를 취하고 위의 연산을 사용하여 계산된 최대 단일 정수를 반환합니다.

  • 우선순위 큐를 pQueue로 가져옵니다.

  • while 루프를 사용하여 1에서 N까지의 숫자로 pQueue를 채웁니다.

  • i<=Num 동안 i를 pQueue로 푸시

  • 이제 pQueue는 1에서 N까지의 정수를 내림차순으로 가지며 크기는 N입니다.

  • 이제 크기가>=1이 될 때까지 while 루프를 사용하여 pQueue를 순회합니다.

  • 최대값을 var1=pQueue.top()으로 가져와서 팝니다.

  • 다음 최대값을 var2=pQueue.top()으로 가져와서 팝니다.

  • var1을 정사각형으로 설정하고 var2를 정사각형으로 설정합니다.

  • var1+var2를 pQueue에 다시 푸시합니다.

  • while 루프가 끝나면 맨 위 요소를 반환합니다.

  • 메인 안에 결과를 출력하세요.

예시

#include <bits/stdc++.h>
using namespace std;
#define lli long long int
int reduceArray(int Num){
   priority_queue<lli> pQueue;
   int i=1;
   while(i<=Num){
      pQueue.push(i);
      i=i+1;
   }
   while (pQueue.size() > 1) {
      lli var1 = pQueue.top();
      pQueue.pop();
      lli var2 = pQueue.top();
      pQueue.pop();
      var1=var1*var1;
      var2=var2*var2;
      pQueue.push(var1+var2);
   }
   return pQueue.top();
}
int main(){
   int Number = 5;
   cout<<"Single element after array reduction: "<<reduceArray(Number);
   return 0;
}

출력

위의 코드를 실행하면 다음과 같은 출력이 생성됩니다.

Single element after array reduction: 1187163713