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

แปลงตัวเลขให้ประกอบด้วยเลข 3 และ 8 เท่านั้นใน C++

โจทย์ปัญหา

ได้รับตัวเลข ให้หา จำนวนการดำเนินการน้อยที่สุด เพื่อทำให้ทุกหลักเป็น 3 หรือ 8 เท่านั้น โดยการดำเนินการแต่ละครั้งเลือกได้ 1 ใน 2 แบบ:

  1. บวกหรือลบ 1 จากตัวเลข
  2. เปลี่ยนหลักใดหลักหนึ่งเป็น 3 หรือ 8

ตัวอย่าง

นำเข้า: 2341974
ผลลัพธ์: 6 operations

แนวคิดการแก้ปัญหา

สังเกตว่า: การเปลี่ยนหลักตัวเลขเป็น 3 หรือ 8 โดยตรง ใช้ 1 Operation ต่อหลัก ในขณะที่การบวก/ลบ 1 อาจส่งผลต่อหลักหลายหลัก (Carry/Borrow) ทำให้ซับซ้อนและมักใช้ Operations มากกว่า

ดังนั้น กลยุทธ์ที่ดีที่สุดคือ: นับหลักที่ไม่ใช่ 3 และไม่ใช่ 8

โค้ดตัวอย่าง (C++)

#include <bits/stdc++.h>
using namespace std;

int calculateMinOperations(long long num) {
    int count = 0;
    while (num > 0) {
        int digit = num % 10;
        if (digit != 3 && digit != 8)
            count++;
        num /= 10;
    }
    return count;
}

int main() {
    long long num = 2341974;
    cout << "Minimum Operations: " << calculateMinOperations(num) << endl;
    return 0;
}

ผลลัพธ์

Minimum Operations: 6

คำอธิบายตัวอย่าง 2341974

DigitValueต้องเปลี่ยน?
22ใช่ (→ 3 หรือ 8)
33ไม่ (เป็น 3 แล้ว)
44ใช่
11ใช่
99ใช่
77ใช่
44ใช่
Total6 Operations

คำอธิบายเพิ่มเติม

  • Time Complexity: O(log n) (จำนวนหลักของตัวเลข)
  • Space Complexity: O(1)
  • สมมติฐาน: การ "เปลี่ยนหลัก" ใช้ Cost = 1 เท่ากับ "บวก/ลบ 1"
  • ถ้า Cost ต่างกัน (เช่น เปลี่ยนหลัก Cost=2, บวก/ลบ Cost=1) จะต้องใช้ DP/Graph Search
  • โจทย์นี้เป็น Greedy ที่ Optimal เพราะแต่ละหลักเป็นอิสระต่อกัน (No Carry/Borrow effect เมื่อเปลี่ยนหลักโดยตรง)