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

C++의 출력 콘테스트 일치

<시간/>

우리가 n개의 팀을 가지고 있고 우리가 항상 다소 약한 팀과 플레이하도록 다소 강한 팀을 배치한다고 가정합니다. 예를 들어 순위 1의 팀이 순위 n의 팀과 플레이하게 하는 것과 같이 이 전략은 대회를 더 흥미롭게 만드는 것입니다. 이제 우리는 문자열 형태로 그들의 최종 대회 경기를 찾아야 합니다.

이 팀은 초기 순위를 나타내는 1에서 n까지의 양의 정수 형태로 제공됩니다. 따라서 1순위가 가장 강한 팀이고 n순위가 가장 약한 팀입니다. 괄호와 쉼표를 사용하여 대회 팀 페어링을 나타냅니다. 페어링에는 괄호('(', ')')를, 파티션에는 쉼표(',')를 사용합니다. 각 라운드의 짝짓기 과정에서 우리는 항상 강한 쪽과 약한 쪽을 만드는 전략을 따라야 합니다.

따라서 입력이 4와 같으면 출력은 ((1,4), (2,3))

가 됩니다.

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

  • create() 함수를 정의하면 low, high, array v2, array v1,

    가 필요합니다.
  • 낮음>=높음이면 -

    • 반환

  • v2 끝에 "(" 연결 v1[low] 연결 ", " v1[high] 연결 ") 삽입

  • 생성(낮음 + 1, 높음 - 1, v2, v1)

  • 주요 방법에서 다음을 수행하십시오 -

  • 어레이 v1, v2 정의

  • initialize i :=1의 경우, i <=n일 때 업데이트(i를 1만큼 증가), −

    • 삽입 변환 i를 v1의 끝에 문자열로 삽입

  • v1> 1의 크기인 동안 −

    • 생성(0, v1, v2, v1의 크기)

    • v1 :=v2

    • v2 어레이 지우기

  • v1의 마지막 요소를 반환

예시

더 나은 이해를 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   void create(int low, int high, vector <string>& v2, vector <string>& v1){
      if (low >= high)
         return;
      v2.push_back("(" + v1[low] + "," + v1[high] + ")");
      create(low + 1, high - 1, v2, v1);
   }
   string findContestMatch(int n) {
      vector v1, v2;
      for (int i = 1; i <= n; i++) {
         v1.push_back(to_string(i));
      }
      while (v1.size() > 1) {
         create(0, v1.size() - 1, v2, v1);
         v1 = v2;
         v2.clear();
      }
      return v1.back();
   }
};
main(){
   Solution ob;
   cout << (ob.findContestMatch(4));
}

입력

4

출력

((1,4),(2,3))