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

นับการพลิกขวา (right flips) น้อยที่สุดเพื่อทำให้อาเรย์เป็น 1 ทั้งหมดใน C++


เราได้รับอาเรย์ 0 และ 1 แทนสถานะหลอดไฟที่ต่อสายเดียวกัน 0 = ปิด, 1 = เปิด สำหรับลำดับ N หลอด หากกดสวิตช์หลอด i ทุกหลอดทางขวา (i+1 ถึง n) จะสลับสถานะ (ON→OFF, OFF→ON) เป้าหมายคือหาจำนวนสวิตช์น้อยที่สุดที่ต้องกดเพื่อทำให้หลอดทุกดวงเปิด (1) สวิตช์เดียวกันกดได้หลายครั้ง เทียบเท่ากับการ flip สถานะทางขวาในอาเรย์ให้กลายเป็น 1 ทั้งหมด

อินพุต

Bulbs[] = {1, 0, 1, 0}

เอาต์พุต

Minimum right flips: 3

คำอธิบาย − สถานะเดิม 1010

กดสวิตช์ 2: 1 101 flip=1
กดสวิตช์ 3: 11 10 flip=2
กดสวิตช์ 4: 111 1 flip=3

อินพุต

Bulbs[] = {1, 0, 0, 0}

เอาต์พุต

Minimum right flips: 1

คำอธิบาย − กดสวิตช์ 2: 1 111 flip=1 ทุกหลอดทางขวาเปิด

วิธีการที่ใช้ในโปรแกรมด้านล่าง

  • อาเรย์ arr[] เก็บสถานะหลอด
  • ฟังก์ชัน minFlips(int arr[], int n) คืนค่าจำนวน right flips น้อยที่สุด
  • count นับ flips, swich[] เก็บสถานะสวิตช์ (เริ่มต้น 0 ทุกตัว)
  • ลูป i=0..n-1:
    • ถ้า arr[i]==1 และ swich[i]==0 → ไม่ทำอะไร (i++)
    • ถ้า arr[i]==0 และ swich[i]==1 → ไม่ทำอะไร (i++)
    • ถ้า arr[i]==0 และ swich[i]==0 → count++ แล้ว flip สถานะทางขวา (while loop)
  • คืนค่า count

ตัวอย่างโค้ด

#include <bits/stdc++.h>
using namespace std;

int minFlips(int arr[], int n) {
    int count = 0;
    int swich[n] = {0};
    for (int i = 0; i < n; i++) {
        if (arr[i] == 1 && swich[i] == 0) i++;
        if (arr[i] == 0 && swich[i] == 1) i++;
        if (arr[i] == 0 && swich[i] == 0) {
            count++;
            int j = i;
            while (j < n) {
                if (arr[j] == 0) arr[j++] = 1;
                else arr[j++] = 0;
            }
        }
    }
    return count;
}

int main() {
    int Arr[] = {0, 1, 0, 1};
    int N = 4;
    cout << "Minimum right flips to set all values in an array: " << minFlips(Arr, N);
    return 0;
}

ผลลัพธ์

Minimum right flips to set all values in an array: 4