ในปัญหานี้ เราได้รับค่าจำนวนเต็มจำนวนมาก (สูงสุด 10 5 ตัวเลข) งานของเราคือพิมพ์จำนวนการตัดทั้งหมดที่ต้องการ โดยให้ส่วนสูงสุดหารด้วย 3 ลงตัว
มาดูตัวอย่างทำความเข้าใจปัญหากัน
ป้อนข้อมูล − 9216
ผลลัพธ์ − 3
คำอธิบาย − จำนวนหารด้วย 9|21|6.
ในการแก้ปัญหานี้ เราจะต้องเริ่มด้วยบิตที่มีนัยสำคัญน้อยที่สุด นั่นคือ หลักสุดท้ายของตัวเลข สำหรับตรงนี้ เราจะหาจำนวนที่น้อยที่สุดที่หารด้วยสามได้ แล้วอัปเดตจำนวนตามนั้น
ตัวอย่าง − ถ้า arr[i] สร้างตัวเลขที่แบ่งได้ 3 ตัว เราจะเพิ่มจำนวนและย้ายไปยังหลักถัดไปของตัวเลข หาก arr[i] ไม่หารด้วย 3 ลงตัว เราจะรวมมันกับหลักถัดไปและตรวจสอบการหารด้วย 3 ลงตัว
การหารด้วย 3 − ตัวเลขหารด้วย 3 ลงตัวถ้าจำนวนหลักของตัวเลขหารด้วยสามลงตัว
ตัวอย่าง
โปรแกรมแสดงการใช้งานโซลูชันของเรา
#include <bits/stdc++.h> using namespace std; int countMaximum3DivisibleNumbers(string number){ int n = number.length(); vector<int> remIndex(3, -1); remIndex[0] = 0; vector<int> counter(n + 1); int r = 0; for (int i = 1; i <= n; i++) { r = (r + number[i-1] - '0') % 3; counter[i] = counter[i-1]; if (remIndex[r] != -1) counter[i] = max(counter[i], counter[remIndex[r]] + 1); remIndex[r] = i+1; } return counter[n]; } int main() { string number = "216873491"; cout<<"The number of 3 divisible number created by cutting "<<number<<" are : " <<countMaximum3DivisibleNumbers(number); return 0; }
ผลลัพธ์
The number of 3 divisible number created by cutting 216873491 are : 5