สมมติว่าเราได้รับจำนวนเต็มสองจำนวน 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