งานคือเพิ่มค่าตัวเลข A ให้มากที่สุดโดยแทนที่หลักบางหลักด้วยหลักจากตัวเลข B หากไม่สามารถเพิ่มค่าได้ ให้คงค่าเดิม เงื่อนไข: หลักจาก B ใช้ได้ครั้งละ 1 ตัวเท่านั้น
ตัวอย่าง
ตัวอย่างที่ 1
Input: A = "1221", B = "1211"
Output: 2221
คำอธิบาย: เลือก '2' จาก B แทน '1' ตัวแรกของ A → ได้ 2221 (แทนที่ครั้งเดียวเพราะ B มี 2 เพียงตัวเดียว)
ตัวอย่างที่ 2
Input: A = "1002", B = "3200"
Output: 3202
คำอธิบาย: เรียง B: 0023 → ใช้หลักใหญ่สุด (3,2) แทนหลักเล็กของ A จากซ้ายไปขวา
แนวทางแก้ปัญหา (Greedy)
- เรียงหลักของ
Bจากน้อยไปมาก (ascending) - เดินผ่าน
Aจากซ้ายไปขวา (หลักสำคัญสุดก่อน) - เดินผ่าน
Bจากขวาไปซ้าย (หลักใหญ่สุดก่อน) - ถ้า
B[j] > A[i]ให้แทนที่A[i] = B[j]แล้วi++,j-- - หาก
B[j] <= A[i]ให้i++ต่อ (ไม่แทนที่) - หยุดเมื่อ
j < 0(ใช้หลัก B หมด) หรือi == len(A)
ตัวอย่างโค้ด
#include <bits/stdc++.h>
using namespace std;
string maximizeValue(string A, string B) {
sort(B.begin(), B.end()); // เรียงน้อยไปมาก
int i = 0, j = B.length() - 1;
while (i < A.length() && j >= 0) {
if (B[j] > A[i]) {
A[i] = B[j];
j--;
}
i++;
}
return A;
}
int main() {
string a = "1204";
string b = "4521";
cout << maximizeValue(a, b) << endl;
return 0;
}
ผลลัพธ์
5424
ขั้นตอน: B เรียงได้ "1245" → ใช้ 5 แทน 1, ใช้ 4 แทน 2, ใช้ 2 แทน 0 → "5424" (หลัก 4 คงเดิมเพราะ B หมดแล้ว)
การทำงานแบบละเอียด
| ขั้นตอน | A[i] | B[j] (max) | เปรียบเทียบ | ผลลัพธ์ |
|---|---|---|---|---|
| i=0 | '1' | '5' | 5 > 1 ✓ | A[0]='5', j=2 |
| i=1 | '2' | '4' | 4 > 2 ✓ | A[1]='4', j=1 |
| i=2 | '0' | '2' | 2 > 0 ✓ | A[2]='2', j=0 |
| i=3 | '4' | '1' | 1 > 4 ✗ | A[3]='4', j=0 |
กรณีพิเศษ
- B มีหลักน้อยกว่า A: ใช้จนหมด B แล้วหยุด
- B มีหลักมากกว่า A: ใช้แค่จำนวนหลักของ A
- ไม่มีการแทนที่: คืนค่า A เดิม
- Leading zero: หาก A นำหน้าด้วย 0 การแทนที่อาจทำให้ค่าลดลง ควรตรวจสอบเพิ่มเติม