สมมติว่าเราได้รับจำนวนเต็มสองจำนวน k และ n หน้าที่ของเราคือดำเนินการสามอย่าง bitwise AND, bitwise OR และ bitwise XOR ระหว่างคู่ของตัวเลขทั้งหมดจนถึงช่วง n เราคืนค่าสูงสุดของการดำเนินการทั้งสามระหว่างตัวเลขสองคู่ใดๆ ที่น้อยกว่าค่าที่กำหนด k
ดังนั้น หากอินพุตเป็น n =5, k =5 ผลลัพธ์จะเป็น 4 3 4
ค่าสูงสุดของการดำเนินการ AND, OR และ XOR ระหว่างคู่ของตัวเลขทั้งหมดที่น้อยกว่า 5 คือ 4, 3 และ 4 ตามลำดับ เราจะเห็นว่าค่าของการดำเนินการเหล่านี้น้อยกว่าค่าที่กำหนด k ซึ่งก็คือ 5.
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- andMax :=0, orMax =0, xorMax =0
- value1 :=0, value2 =0, value3 =0
- สำหรับการเริ่มต้น i :=1 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ:
- value1 :=i AND j
- value2 :=i หรือ j
- value3 :=i XOR j
- ถ้า value1> andMax และ value1
- และแม็กซ์ :=value1
- ถ้า value2> orMax และ value2
- orMax :=value2
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> void solve(int n, int k) { int andMax = 0, orMax = 0, xorMax = 0; int value1 = 0, value2 = 0, value3 = 0; for (int i = 1; i <= n; i++) { for (int j = i+1; j <= n; j++) { value1 = i & j; value2 = i | j; value3 = i ^ j; if (value1 > andMax && value1 < k) andMax = value1; if (value2 > orMax && value2 < k) orMax = value2; if (value3 > xorMax && value3 < k) xorMax = value3; } } printf("%d %d %d ", andMax, orMax, xorMax); } int main() { solve(5, 5); return 0; }
อินพุต
5, 5
ผลลัพธ์
4 3 4