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

จำนวนการดำเนินการขั้นต่ำเพื่อทำให้ XOR ของอาร์เรย์เป็นศูนย์ใน C++


ข้อความโจทย์

เราได้รับอาร์เรย์ n สมาชิก งานคือทำให้ XOR ของอาร์เรย์ทั้งหมดเป็น 0 สามารถทำได้ดังนี้

เลือกสมาชิกใดสมาชิกหนึ่ง −

  • หลังเลือกสมาชิกแล้ว สามารถเพิ่มหรือลดค่าลง 1 ได้
  • ต้องหาจำนวนการเพิ่ม/ลดขั้นต่ำสำหรับสมาชิกที่เลือก เพื่อให้ XOR ของอาร์เรย์ทั้งหมดเป็นศูนย์

ตัวอย่าง

ถ้า arr[] = {2, 4, 7} ต้องการ 1 การดำเนินการ −

  • เลือกสมาชิก 2
  • ลดลง 1
  • ตอนนี้อาร์เรย์กลายเป็น {3, 4, 7} และ XOR ของมันคือ 0

อัลกอริทึม

  • หา XOR ของอาร์เรย์ทั้งหมด
  • สมมติเราเลือกสมาชิก arr[i] ต้นทุนที่ต้องใช้สำหรับสมาชิกนั้นจะเป็น absolute(arr[i] - (XORsum ^ arr[i]))
  • คำนวณค่าต่ำสุดของค่าสัมบูรณ์เหล่านี้สำหรับทุกสมาชิก จะได้จำนวนการดำเนินการขั้นต่ำ

ตัวอย่าง

#include <iostream> #include <climits> #include <cmath> using namespace std; void getMinCost(int *arr, int n) {     int operations = INT_MAX;     int elem;     int xorValue = 0;     for (int i = 0; i < n; ++i) {       xorValue = xorValue ^ arr[i];     }     for (int i = 0; i < n; ++i) {       if (operations > abs((xorValue ^ arr[i]) - arr[i])) {           operations = abs((xorValue ^ arr[i]) - arr[i]);           elem = arr[i];       }     }     cout << "Element= " << elem << endl;     cout << "Minimum required operations = " << abs(operations) << endl; } int main() {     int arr[] = {2, 4, 7};     int n = sizeof(arr) / sizeof(arr[0]);     getMinCost(arr, n);     return 0; }

ผลลัพธ์

เมื่อคอมไพล์และรันโปรแกรมข้างต้น จะได้ผลลัพธ์ดังนี้

Element = 2 Minimum required operations = 1