Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

จำนวนจุดคงที่สูงสุดโดยใช้การแลกเปลี่ยนสูงสุด 1 ครั้งใน C++


คำชี้แจงปัญหา

ให้การเปลี่ยนแปลงขององค์ประกอบ N จาก 0 ถึง N-1 จุดคงที่คือดัชนีที่มีค่าเท่ากับดัชนีเช่น arr[i] =i คุณสามารถทำการแลกเปลี่ยนได้มากที่สุด 1 ครั้ง ค้นหาคะแนนคงที่สูงสุดที่คุณจะได้รับ

ตัวอย่าง

หากอาร์เรย์อินพุตคือ {0, 1, 2, 3, 4, 6, 5} คำตอบคือ 7

  • ในการปรับจุดคงที่ เราต้องสลับ 6 กับ 5
  • หลังจากอาร์เรย์ทั้งหมดนี้กลายเป็นจุดคงที่และค่าสูงสุดของจุดคงที่คือ 7

อัลกอริทึม

  • สร้างอาร์เรย์ pos ที่เก็บตำแหน่งของแต่ละองค์ประกอบในอาร์เรย์อินพุต
  • ตอนนี้ เราสำรวจอาร์เรย์และมีกรณีต่อไปนี้ −
    • ถ้า a[i] =i เราสามารถเพิ่มจำนวนและก้าวต่อไปได้
    • ถ้า 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