Diberikan urutan bilangan alami, Anda dapat menambahkan bilangan alami ke bilangan apa pun dalam urutan sedemikian sehingga xornya menjadi nol. Tujuan saya adalah untuk meminimalkan jumlah angka yang ditambahkan.
Perhatikan contoh-contoh berikut:
Untuk jawabannya adalah ; menambahkan ke kita mendapatkan .
Untuk jawabannya adalah ; menambahkan ke dan ke kita mendapatkan .
Untuk jawabannya adalah , karena .
Saya mencoba bekerja pada representasi biner dari nomor urut tetapi menjadi sangat kompleks. Saya ingin tahu apakah ada cara sederhana dan efisien untuk menyelesaikan masalah ini.
algorithms
integers
xor
Pravin Gadakh
sumber
sumber
Jawaban:
Tampaknya bagi saya bahwaa=ai⊕⋯⊕an memegang semua informasi yang diperlukan: 1 bit dalam a adalah bit yang Anda butuhkan untuk memasukkan (tepatnya) salah satunya ai . Karena Anda hanya diperbolehkan menambahkan , Anda harus menemukannyaai di mana bit yang sesuai j adalah 0 dan balikkan - ini menyebabkan biaya yang sama untuk semua ai , itu adalah 2j , jadi pilihannya tidak masalah. Masalah dimulai jika tidak ada yang seperti ituai .
Itulah sebabnya Anda harus melakukan ini secara berulang dan bekerja dari bagian paling tidak penting ke atas. Lanjutkan seperti di atas; jika tidak ada yang cocokai , memilih ai dengan jumlah maksimum 1 bit yang tersisa dari posisi saat ini - ini meningkatkan peluang untuk menemukan kandidat yang cocok di iterasi masa depan -, balikkan bit dan bawa, yang membalik semua yang ke kiri sampai Anda membalikkan nol ke yang satu. Perhatikan bahwa kami masih menambahkan2j ). Sebagai carry hanya menyebar ke kiri, pilihan sebelumnya tidak valid. Hitung ulanga dan lanjutkan dengan j+1 ; ulangi sampai Anda milikia=0 .
Perhatikan bahwa ini hanya heuristik sejauh yang saya tahu: pilihani mungkin suboptimal jika menyebabkan banyak bit a menjadi tidak nol. Saya tidak yakin apakah ini bisa dihindari.
sumber
Saya sebenarnya tidak punya solusi, tetapi di sini ada beberapa ide yang muncul.
Jika Anda melihat hasil XORing semua angka dalam urutan, yang memberi batas atas jumlah penambahan yang perlu Anda lakukan. Misalnya, dalam contoh Anda10,4,5,1 , kita punya 10⊕4⊕5⊕1=10 , jadi Anda tahu Anda tidak perlu menambahkan lebih dari 8 (karena 8-bit adalah set tertinggi). Mendistribusikan hingga delapan "yang" didistribusikan empat cara, adalah satu set kombinasi yang cukup kecil. Saya tidak ingat formula itu selarut ini, tapi adan! di suatu tempat di sana.
Untuk memberikan landasan itu sedikit lebih banyak landasan, pertimbangkan bilangan bulat sewenang-wenangA,B seperti yang A⊕B=8 . Bit yang lebih tinggi dari bit 3 jelas semua dibatalkan, sehingga Anda dapat mengabaikannya. Untuk empat bit yang lebih rendah, mereka XOR ke 8, jadi kasus terburuk yang mungkin (dalam hal jumlah yang Anda perlu tambahkan) adalah jika A=8 dan B=0 (semua nol kecuali untuk bit tertinggi) karena Anda harus menambahkan +8 ke B untuk mendapatkan set bit atas. Jika ada salah satu bit di dalam salah satu nomor, Anda perlu menambahkan kurang.
Mungkin Anda bisa mulai dari ini, dan mengembangkan jumlah maksimum yang lebih ketat untuk ditambahkan.
sumber