문제 설명
0에서 N-1까지 N 요소의 순열이 주어집니다. 고정 소수점은 값이 인덱스와 같은 인덱스 즉, arr[i] =i입니다. 최대 1개의 스왑을 수행할 수 있습니다. 얻을 수 있는 최대 고정 포인트 수를 찾으십시오.
예
입력 배열이 {0, 1, 2, 3, 4, 6, 5}이면 답은 7입니다.
- 고정 소수점을 조정하려면 6과 5를 바꿔야 합니다.
- 이 전체 배열이 고정 소수점이 되고 고정 소수점의 최대값은 7이 됩니다.
알고리즘
- 입력 배열에서 각 요소의 위치를 유지하는 배열 pos 생성
- 이제 배열을 탐색하고 다음과 같은 경우가 있습니다. -
- 만약, a[i] =i. 카운트를 늘리고 계속 진행할 수 있습니다.
- If, pos[i] =a[i] 즉, 2개의 항을 교환하면 i와 a[i]가 고정 소수점이 되어 개수가 2 증가합니다. 교환은 최대 한 번만 수행될 수 있다는 점에 유의하십시오. .
- 순회가 끝날 때 스왑을 수행하지 않았다면 스왑이 카운트를 2만큼 늘릴 수 없었음을 의미하므로 이제 고정 소수점이 아닌 요소가 2개 이상 있으면 다음을 수행할 수 있습니다. 스왑을 수행하여 개수를 1만큼 늘리십시오. 즉, 해당 지점 중 하나를 고정 지점으로 만듭니다.
예
#include <bits/stdc++.h> using namespace std; int getMaximumFixedPoints(int arr[], int n) { int i, pos[n], count = 0, swapped = 0; for (i = 0; i < n; i++) pos[arr[i]] = i; for (i = 0; i < n; i++) { if (arr[i] == i) { count++; } else if (swapped == 0 && pos[i] == arr[i]) { count += 2; swapped = 1; } } if (swapped == 0 && count < n - 1) { count++; } return count; } int main() { int arr[] = {0, 1, 2, 3, 4, 6, 5}; int n = sizeof(arr) / sizeof(arr[0]); cout << "Maximum value of fixed point = " << getMaximumFixedPoints(arr, n) << endl; return 0; }
출력
위의 프로그램을 컴파일하고 실행할 때. 다음 출력을 생성합니다 -
Maximum edges = 7